Legarea butonul de control pentru date (WPF)

0

Problema

Am de lucru pe o cerere arată 20 de grafice, butoane de control într-un MainWindow (Button1 să Button20). Fiecare buton de comandă poate afișa un Conținut șir, și are un tooltip concepute după cum urmează :

<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>

Aș dori să definim șirul de conținut și tooltip string pentru fiecare buton într-un fișier XML astfel încât această informație poate fi schimbat prin modificarea fișierului XML.

Pentru aceasta, am creat o ViewModel definirea unui obiect numit Bouton (în limba franceză) :

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;
    }
}

Când citești fișierul XML, am crea 20 de obiecte de Bouton tip cu informații despre boutonNumber, Conținutul și Tooltip. Apoi, toate aceste Bouton obiecte sunt stocate într-o Listă de colectare.

Acum vreau să folosesc DataBinding între Bouton listă și grafic de controale pe MainWindow pentru a fi capabil de a afișa conținutul de coarde și tooltip șir pe fiecare buton. În MainWindow, am folosit urmatorul cod :

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

în cazul în care lst este o Listă de colectare corect inițializat.

Dar nu știu cum să facă databinding munca pe Butonul de control. Cum pot face ca fiecare dintre cele 20 de controale Buton corect link-ul corespunzător Bouton obiect (conținute în Boutons de colectare) ? Adică cum poate Button1 control siruri de caractere sale din Bouton1 obiect, Button2 de control obține șirul de Bouton2 obiect și așa mai departe până Button20 de control și Bouton20 obiect ?

Vă mulțumesc pentru ajutor. Vă rugăm să rețineți că sunt un incepator cu WPF si acesta este primul meu proiect de WPF cu Visual Studio.

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

Cel mai bun răspuns

0

Cred că cea mai simplă opțiune ar fi să-și încheie nasturele într-un UserControl.

Acest UserControl atunci conține o proprietate de tip Bouton (nu mare denumire btw. - chiar dacă este o limbă diferită, termenul de "buton" există deja, astfel încât acest lucru este destul de ambiguă. Ca un non-vorbitor nativ de limba engleză mine, am recomanda, de asemenea, obtinerea utilizate pentru numirea în limba engleză, acesta va salva o mulțime de dureri de cap pe termen lung, dar care ar putea fi subiectiv )

Apoi, puteți lega direct la proprietate și în UserControl șablon. Tot ce trebuie să faceți este să atribui fiecare UserControl butonul corect de date.

de exemplu.

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

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

și în UserControl șablon:

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

Apoi, puteți plasa UserControl în XAML astfel:

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

<ctrls:CustomButton name="myFirstButton"/>

Acum tot ce trebuie sa faci este asigurați-vă că fiecare CustomButton a lor ParsedButtonData set corespunzătoare bucată de date. Puteți seta acest manual pentru fiecare buton creat în XAML, sau puteți crea CustomButtons prin C#, în primul rând.

Dacă vă creați UserControls în XAML, de exemplu:

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

Alternativ, ați putea dori să se uite în extinderea ItemsControl. Practic este făcut pentru acest tip de aplicație. O ItemsControl are o ItemsSource, care poate fi orice tip de colectare, cum ar fi List<> sau ObservableCollection<>. Atunci își creează copii din această colecție, stabilirea DataContext automat la elementul corespunzător din listă.

Exemple de care ar fi DataGrid sau ListView. Aflu că pentru a fi un pic mai implicat, deși, dacă într-adevăr vrei doar pentru a plasa o grămadă de Butoane de pe un singur punct de Vedere.

2021-11-22 17:47:49

Apreciez interesul tau pentru întrebarea mea, răspunsul dumneavoastră și detaliile de cod-ai dat în ea. Eu va dau un încercați cât mai curând posibil. Multumesc mult pentru ajutor !
Bruno Barral

Am incercat acest cod de ieri. Mai am cateva intrebari: - am făcut clasa CustomButton inheritate de la Buton (mai degrabă decât de UserControl cum ai sugerat tu) dar am un mesaj de eroare legat de evenimentul Click care nu este declarat a fi prezent în CustomButton clasa. Sunt surprins de la clasa de baza (Buton) a evenimentul Click puse în aplicare. Am încercat să sun de bază.Faceți clic pe() din CustomButton dar tot primesc un mesaj de eroare. Nu înțeleg de ce faceți Clic pe eveniment nu există în CustomButton, deoarece nu există în Butonul de clasa.
Bruno Barral

De ce nu folosesti un UserControl în loc de a moșteni de la Buton? Într-un UserControl, o înregistra cu ușurință un eveniment click pentru orice buton loc în șablon.
Shrimperator

Ok, voi încerca acest lucru. Multumesc.
Bruno Barral

În alte limbi

Această pagină este în alte limbi

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