Łączenie elementów sterowania przyciskami z danymi (WPF)

0

Pytanie

Pracuję nad aplikacją, w którym są wyświetlane 20 elementów graficznych przycisków w głównym oknie (od przyciski 1 do przycisku 20). Każdy element sterowania przyciskiem można wyświetlić wiersz zawartości i ma podpowiedź, wykonaną w następujący sposób :

<Button x:Name="button1" FontWeight="Bold" FontSize="15" Content="" HorizontalAlignment="Left" Margin="20,69,0,0" VerticalAlignment="Top" Width="92" Height="29" Click="Button_Click" Background="#FFFFFFFF" MouseEnter="button_MouseEnter">
        <Button.ToolTip>
            <Border Margin="-4,0,-4,-3" Padding="10" Background="Yellow">
                <Border.BitmapEffect>
                    <OuterGlowBitmapEffect></OuterGlowBitmapEffect>
                </Border.BitmapEffect>
                <Label x:Name ="lbl1" FontSize="20" Content="{Binding Path=ToolTip}">
                </Label>
            </Border>
        </Button.ToolTip>
        <Button.Effect>
            <DropShadowEffect/>
        </Button.Effect>
    </Button>

Chciałbym określić zawartość wiersz polecenia i wskazówki dla każdego przycisku w pliku XML, aby te informacje można było zmienić, modyfikując plik XML.

Do tego stworzyłem model prezentacji, która definiuje obiekt pod nazwą Bud (po francusku). :

public class Bouton : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    void Notify(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    int boutonNumber;
    public int BoutonNumber{ get { return boutonNumber; } set { boutonNumber= value; Notify("BoutonNumber"); } }
    string texteBouton;
    public string TexteBouton { get { return texteBouton; } set { texteBouton = value; Notify("TexteBouton"); } }
    string tooltip;
    public string Tooltip { get { return tooltip; } set { tooltip = value; Notify("ToolTip"); } }
    public Bouton(int nb, string tb, string tt)
    {
        BoutonNumber = nb;
        TexteBouton = tb;
        Tooltip = tt;
    }
}

Podczas odczytu pliku XML tworzę 20 obiektów typu Pączek z informacją o numerze Pączka, Zawartości i podpowiedzi. Następnie wszystkie te obiekty Pączka są zapisywane w kolekcji list.

Teraz chcę użyć wiązanie danych pomiędzy moim listą Pączka i elementami graficznymi zarządzania w moim oknie głównym, aby móc wyświetlić wiersz zawartości i ciąg podpowiedzi na każdym przycisku. W głównym oknie użyłem następujący kod :

public MainWindow()
    {
        InitializeComponent();
        List<Bouton> lst = Utilities.CreateList();
        this.DataContext = lst;
    }

gdzie lst-to dobrze инициализированная kolekcja list.

Ale nie wiem, jak zmusić wiązanie danych praca z elementami sterowania przyciskami. Jak mogę poprawnie połączyć każdy z 20 elementów sterowania przyciskami z odpowiednim obiektem Pączka (zawartych w kolekcji Pąków) ? Mam na myśli, jako element zarządzania Button1 może dostać swoje wiersze z mojego obiektu Bouton1, formant Button2 może dostać swój wiersz z obiektu Bouton2 i tak dalej, aż element zarządzania Button20 i obiekt Bouton20 nie pojawią się ?

Dziękuję ci za pomoc. Proszę zwrócić uwagę, że jestem początkujący w WPF, i jest to mój pierwszy projekt WPF z Visual Studio.

c# controls windows wpf
2021-11-22 16:00:24
1

Najlepsza odpowiedź

0

Myślę, że najprostszym rozwiązaniem byłoby zawinąć swoją przycisk formant niestandardowy.

Następnie ten formant niestandardowy zawiera właściwość typu Bouton (nawiasem mówiąc, nie bardzo trafną nazwę. - nawet jeśli jest to inny język, termin "przycisk" już istnieje, więc jest to dość niejednoznaczny. Jak sam nie jest językiem angielskim, polecam również przyzwyczaić się nazwisk w języku angielskim, to wybawi was od wielu bólów głowy w dłuższej perspektywie, ale to może być subiektywne )

Następnie można bezpośrednio podłączony do tej właściwości w szablonie UserControl. Wszystko, co musisz zrobić, to przypisać każdemu użytkownikowi prawidłowe dane przycisku.

np..

public class CustomButton : UserControl
{
    public Bouton ParsedButtonData { get; set; }

    public CustomButton()
    {
        DataContext = this;
        InitializeComponent();
    }
}

i w szablonie swojego niestandardowego formantu:

<Button ...>
    <Button.ToolTip>
        <Border ...>
            <Label Content="{Binding ParsedButtonData.Tooltip}" ...>
            </Label>
        </Border>
    </Button.ToolTip>
</Button>

Następnie można umieścić formant niestandardowy w swój XAML w następujący sposób:

xmlns:ctrls="clr-namespace:MyProject.MyNamespace"

<ctrls:CustomButton name="myFirstButton"/>

Teraz wszystko, co musisz zrobić, to upewnić się, że każda niestandardowego przycisku ma swoje dane ParsedButtonData, nastawieni na odpowiedni fragment danych. Można albo ustawić to ręcznie dla każdego przycisku, stworzonej w swoim XAML, albo w pierwszej kolejności utworzyć niestandardowe przyciski za pomocą C#.

Jeśli stworzysz swoje własne elementy sterowania w XAML, np.:

public void SomeMethod()
{
    myFirstButton.ParsedButtonData = lst[0];
}

Alternatywnie można rozważyć możliwość rozszerzenia ItemsControl. On jest w zasadzie stworzony dla tego rodzaju aplikacji. Formant ItemsControl ma źródło elementów, który może być dowolnego typu kolekcji, np. List<> lub ObservableCollection<>. Następnie tworzy swoje podrzędne elementy z tej kolekcji, automatycznie ustawia DataContext na odpowiedni element w podanej liście.

Przykładami tego mogą być DataGrid lub ListView. Uważam, że jest to trochę skomplikowane, chociaż, jeśli naprawdę chcesz umieścić kilka przycisków w jednym widoku.

2021-11-22 17:47:49

Naprawdę doceniam twoje zainteresowanie moim pytaniem, twoje odpowiedzi i szczegóły kodu, który można w nim określone. Postaram się zrobić to jak najszybciej. Bardzo dziękuję za pomoc !
Bruno Barral

Próbowałem ten kod wczoraj. Nadal mam kilka pytań : zrobiłem klasa CustomButton hostowaną od Button (a nie od UserControl, jak sugerowali), ale mam komunikat o błędzie o zdarzeniu kliknięcia, która, jak mówią, nie ma w klasie CustomButton. Jestem zaskoczony, tak jak w klasie bazowej (Przycisk) zrealizowane zdarzenie Click. Próbowałem dodzwonić się do bazy.Naciśnij przycisk() w niestandardowego przycisku, ale nadal pojawia się komunikat o błędzie. Nie rozumiem, dlaczego zdarzenie kliknięcia nie istnieje w CustomButton, tak jak to jest w klasie przycisków.
Bruno Barral

Dlaczego nie użyć niestandardowego formantu zamiast dziedziczenia przycisku? W niestandardowej kontroli można łatwo zarejestrować zdarzenie click dla każdego przycisku, który można umieścić w szablonie.
Shrimperator

Dobrze, spróbuję to zrobić. Dziękuję.
Bruno Barral

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................