Propojení ovládací tlačítka na data (WPF)

0

Otázka

Já jsem pracoval na aplikace ukazuje 20 grafických tlačítek ovládací prvky v MainWindow (Button1 Button20). Každé ovládací tlačítko lze zobrazit Obsah řetězec, a má tooltip navržen následovně :

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

Chtěl bych definovat řetězec obsahu a popisku řetězec pro každé tlačítko v souboru XML, takže tyto informace lze změnit úpravou souboru XML.

Pro to, vytvořil jsem ViewModel definování objektu tzv. Bouton (ve francouzštině) :

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

Při čtení XML souboru, vytvořit 20 objektů Bouton type s informacemi o boutonNumber, Obsah a Popis. Pak všechny tyto Bouton objekty jsou uloženy do Seznamu kolekce.

Teď chci využít DataBinding mezi mé Bouton seznam a grafické ovládací prvky na můj MainWindow být schopen zobrazit obsah řetězec a řetězec popisku na každé tlačítko. V MainWindow, jsem použil následující kód :

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

kde lst je Seznam sbírku správně inicializován.

Ale já nevím, jak udělat databinding práci na ovládací Tlačítka. Jak mohu udělat každý z 20 ovládací Tlačítka správně odkaz na odpovídající Bouton objekt (obsažené v Boutons kolekce) ? Chci říct, jak může ovládací prvek Button1 dostat své nitky z mého Bouton1 objekt, Button2 kontrolu získat jeho řetězec z Bouton2 objektu a tak dále, dokud Button20 kontrolu a Bouton20 objekt ?

Děkujeme vám za vaši pomoc. Vezměte prosím na vědomí, že jsem začátečník s WPF a tohle je můj první WPF projektu s Visual Studio.

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

Nejlepší odpověď

0

Myslím, že nejjednodušší možností by bylo zabalit své tlačítko v UserControl.

Tento UserControl pak obsahuje vlastnost typ Bouton (není velký pojmenování btw. - i když je to jiný jazyk, termín "button" již existuje, takže je to poněkud nejednoznačné. Jako non-rodilý anglický mluvčí sám, doporučuji také stále používá k pojmenování v angličtině, bude to ušetří spoustu bolesti hlavy v dlouhodobém horizontu, ale to může být subjektivní )

Poté můžete vázat přímo k tomuto majetku v UserControl šablony. Vše, co musíte udělat, je přiřadit každému UserControl na tlačítko opravit údaje.

např.

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

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

a ve vašem UserControl je šablona:

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

Pak můžete umístit UserControl ve vašem XAML, jako je tento:

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

<ctrls:CustomButton name="myFirstButton"/>

Nyní vše, co musíte udělat, je ujistěte se, že každý CustomButton má své ParsedButtonData nastavit na odpovídající údaj. Můžete buď nastavit ručně pro každé tlačítko vytvořeny v jazyce XAML, nebo si můžete vytvořit CustomButtons přes C# na prvním místě.

Pokud si vytvořit svůj UserControls v XAML, například:

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

Případně, možná budete chtít podívat do prodloužení ItemsControl. To je v podstatě provedena pro tento druh aplikace. O ItemsControl má ItemsSource, což může být jakýkoliv typ kolekce jako List<> nebo ObservableCollection<>. To pak vytváří své děti z této sbírky, nastavení DataContext automaticky k odpovídající prvek v seznamu.

Příklady, které by DataGrid nebo ListView. Zjistil jsem, že být trochu více zapojit, i když, pokud opravdu chcete jen místo pár Tlačítky na jediném Zobrazení.

2021-11-22 17:47:49

Opravdu si vážím vašeho zájmu o moje otázka, vaše odpověď a podrobnosti o kód, který jste dal v ní. Jsem se to zkusit co nejdříve. Díky moc za vaši pomoc !
Bruno Barral

Zkoušel jsem tento kód včera. Ještě mám nějaké otázky : udělal jsem třídu CustomButton inheritate z Tlačítko (spíše než z UserControl, jak jste navrhl), ale já chybová zpráva o události Click, který je řekl, aby být přítomen v CustomButton třídy. Jsem překvapen, protože základní třídy (Tlačítko) Klepněte na událost provedena. Snažil jsem se zavolat na základnu.Klepněte na tlačítko() z CustomButton ale pořád se chybová zpráva. Nechápu, proč se události Click neexistuje v CustomButton, jak to existuje na Tlačítko třídy.
Bruno Barral

Proč nepoužiješ UserControl namísto dědí z Tlačítka? V UserControl, jste snadno zaregistrovat, klepněte na událost pro všechny tlačítka si místo v šabloně.
Shrimperator

Ok zkusím to. Děkuji.
Bruno Barral

V jiných jazycích

Tato stránka je v jiných jazycích

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