Prepojenie ovládacie prvky tlačidlo údajov (WPF)

0

Otázka

Ja som pracoval na aplikáciu ukazuje 20 grafické tlačidlá, ovládacie prvky v MainWindow (Button1 na Button20). Každé tlačidlo control môžete zobraziť Obsah reťazec, a má tooltip navrhnuté nasledovne :

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

Ja by som chcel definovať reťazec obsah a tooltip reťazec pre každé tlačidlo v XML súboru, takže tieto informácie môžu sa zmeniť úpravou XML súboru.

Na to, vytvoril som ViewModel definovanie objektu s názvom Bouton (vo francúzštine) :

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

Pri čítaní súboru XML, som vytvoriť 20 objekty Bouton typu s informáciami o boutonNumber, Obsah a Rade. Potom všetky tieto Bouton objekty sú uložené do Zoznamu zbierky.

Teraz chcem použiť DataBinding medzi moje Bouton zoznam a grafické prvky na mojom MainWindow byť schopný zobraziť obsah reťazec a tooltip reťazec na každé tlačidlo. V MainWindow, som použil nasledovný kód :

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

kde lst je Zoznam zber správne inicializovať.

Ale neviem, ako urobiť databinding práce na Tlačidlo ovládacie prvky. Ako môžem, aby každý z 20 Tlačidlo ovládacie prvky správne odkaz na príslušné Bouton objektov, ktoré sú obsiahnuté v Boutons zber) ? Chcem povedať, ako môže Button1 kontrolu si svoje struny z môjho Bouton1 objekt, Button2 kontrolu si svoje reťazec z Bouton2 objekt a tak ďalej, až kým Button20 kontroly a Bouton20 objekt ?

Ďakujeme vám za vašu pomoc. Vezmite prosím na vedomie, som začiatočník s WPF a toto je môj prvý WPF projektu s Visual Studio.

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

Najlepšiu odpoveď

0

Myslím, že najjednoduchšia možnosť, že by sa zabaliť vaše tlačidlo v UserControl.

Tento UserControl potom obsahuje majetku typ Bouton (nie je veľký pomenovanie btw. - aj keď je to iný jazyk, výraz "tlačidlo" už existuje, tak to je dosť nejednoznačné. Ako non-native english speaker sám, odporúčam tiež zvyknúť na pomenovanie v angličtine, to vám ušetrí veľa bolesti hlavy v dlhodobom horizonte, ale že môže byť subjektívny )

Potom môžete sa viažu priamo na majetku v UserControl je šablóny. Všetko, čo musíte urobiť, je priradiť každej UserControl správne tlačidlo údajov.

napr.

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

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

a vo vašom UserControl je šablóny:

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

Potom môžete umiestniť UserControl vo vašom XAML, ako je tento:

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

<ctrls:CustomButton name="myFirstButton"/>

Teraz všetko, čo musíte urobiť, je uistiť sa, každý CustomButton má svoje ParsedButtonData nastavený na príslušný údaj. Môžete buď nastaviť ručne pre každé tlačidlo vytvorený vo vašej XAML, alebo môžete vytvoriť CustomButtons cez C# na prvom mieste.

Ak si vytvoriť svoj UserControls v XAML, napríklad:

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

Prípadne, možno budete chcieť pozrieť do rozšírenie ItemsControl. Je to v podstate vytvorené pre tento druh použitia. Je ItemsControl má ItemsSource, ktoré môžu byť akejkoľvek kolekcie typ ako List<> alebo ObservableCollection<>. To potom vytvára svoje deti z tejto kolekcie, nastavenie DataContext automaticky do príslušného prvku v uvedenom zozname.

Príklady, ktoré by boli DataGrid alebo ListView. Zistil som, že bude trochu viac zapojiť, aj keď, ak ste naozaj len chcete umiestniť partiou a Tlačidlá na jedinom Okne.

2021-11-22 17:47:49

Naozaj oceňujem váš záujem o moju otázku, odpoveď a detaily kód, ktorý ste dali v ňom. Ja som sa to skúsiť, akonáhle je to možné. Ďakujeme za vašu pomoc !
Bruno Barral

Snažil som sa tento kód včera. Ešte mám pár otázok : som urobil triedy CustomButton inheritate od Tlačidlo (namiesto z UserControl, ako si navrhol), ale mám chybové hlásenie, Kliknite na udalosť, ktorej sa hovorí, nie je prítomný v CustomButton triedy. Som prekvapený, pretože základnej triedy (Tlačidlo) má Kliknite na podujatia realizované. Snažil som sa zavolať základňu.Kliknite na ikonu() z CustomButton, ale stále som sa zobrazí chybové hlásenie. Nechápem, prečo Kliknite na udalosť neexistuje v CustomButton, ako sa to nevyrieši v Tlačidlo triedy.
Bruno Barral

Prečo používate UserControl namiesto zdedí od Tlačidlo? V UserControl, si ľahko zaregistrovať kliknite na udalosť pre ľubovoľné tlačidlo môžete umiestniť v šablóne.
Shrimperator

Ok, skúsim to. Ďakujem.
Bruno Barral

V iných jazykoch

Táto stránka je v iných jazykoch

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