Reliant le bouton de contrôle de données (WPF)

0

La question

Je suis en train de travailler sur une application montrant 20 graphique boutons de contrôles dans une MainWindow (Button1 pour Button20). Chaque bouton de contrôle peut afficher une chaîne de Contenu, et a une info-bulle conçu comme suit :

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

Je voudrais définir la chaîne de contenu et de la chaîne d'info-bulle pour chaque bouton dans un fichier XML de sorte que cette information peut être changé en modifiant le fichier XML.

Pour cela, j'ai créé un ViewModel de la définition d'un objet appelé Bouton (en français) :

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

Lors de la lecture du fichier XML, j'ai créer 20 objets de Bouton de type de l'information sur boutonNumber, le Contenu et l'info-bulle. Puis tous ces Bouton objets sont stockés dans une Liste de collection.

Maintenant, je veux utiliser la liaison de données entre mon Bouton de la liste et le contrôle du graphique sur mon MainWindow pour être en mesure d'afficher le contenu de la chaîne et de la chaîne d'info-bulle sur chaque bouton. Dans la MainWindow, j'ai utilisé le code suivant :

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

où lst est une Liste de la collection initialisé correctement.

Mais je ne sais pas comment faire la liaison de données de travail sur les contrôles de Bouton. Comment puis-je faire de chacun des 20 contrôles de Bouton correctement lien vers le Bouton correspondant de l'objet (dans les Boutons de la collection) ? Je veux dire, comment pouvez-contrôle Button1 obtenir ses cordes de mon Bouton1 objet, le Bouton2 contrôle de sa chaîne de Bouton2 objet et ainsi de suite jusqu'à ce que Button20 de contrôle et de Bouton20 objet ?

Je vous remercie pour votre aide. Veuillez noter que je suis un débutant avec WPF et c'est mon premier projet WPF avec Visual Studio.

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

La meilleure réponse

0

Je pense l'option la plus simple serait pour envelopper votre bouton dans un UserControl.

Cette UserControl contient alors une propriété de type Bouton (pas grand naming btw. - même si c'est dans une langue différente, le terme "bouton" existe déjà, donc c'est plutôt ambigu. Comme un non-anglophone, moi-même, je recommande également d'obtenir utilisé à d'appellation en anglais, il vous fera économiser beaucoup de maux de tête dans le long terme, mais qui peut-être très subjectif )

Vous pouvez ensuite lier directement à la propriété dans l'objet UserControl modèle. Tout ce que vous avez à faire est d'attribuer à chaque UserControl le bouton de données.

par exemple.

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

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

et dans votre UserControl modèle:

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

Vous pouvez ensuite placer le UserControl dans votre XAML comme ceci:

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

<ctrls:CustomButton name="myFirstButton"/>

Maintenant, tout ce que vous avez à faire est de vous assurer que chaque CustomButton a leur ParsedButtonData ensemble correspondant à l'élément de données. Vous pouvez régler manuellement pour chaque bouton créé dans votre XAML, ou vous pouvez créer le CustomButtons par le biais de C# en premier lieu.

Si vous créez votre UserControls en XAML, par exemple:

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

Sinon, vous voudrez peut-être regarder dans l'extension ItemsControl. En gros, c'est fait pour ce genre d'application. Un ItemsControl a un ItemsSource, qui peut être n'importe quel type de collection tels que List<> ou ObservableCollection<>. Il crée alors ses enfants de cette collection, la définition de la DataContext automatiquement à l'élément correspondant dans la liste.

Des exemples de ce serait DataGrid ou ListView. Je trouve que, pour être un peu plus impliqué, si vraiment vous voulez placer un tas de Boutons sur un seul point de Vue.

2021-11-22 17:47:49

J'apprécie vraiment votre intérêt pour ma question, votre réponse et les détails de code que vous avez donné à elle. Je vais l'essayer dès que possible. Merci beaucoup pour votre aide !
Bruno Barral

J'ai essayé ce code hier. J'ai encore quelques questions : j'ai fait la classe CustomButton inheritate de Bouton (plutôt que de UserControl, comme vous l'avez suggéré) mais j'ai un message d'erreur sur Cliquez sur l'événement qui est dit ne pas être présent dans la CustomButton classe. Je suis surpris depuis la classe de base (Bouton) a l'événement Click de mise en œuvre. J'ai essayé d'appeler la base.Cliquez sur la (les) de la CustomButton mais j'ai toujours un message d'erreur. Je ne comprends pas pourquoi Cliquez sur l'événement n'existe pas dans CustomButton, comme il n'existe pas dans la classe Button.
Bruno Barral

Pourquoi n'utilisez-vous pas un UserControl au lieu d'hériter de Bouton? Dans un UserControl, vous un facilement enregistrer un événement de clic de n'importe quel bouton vous placez dans le modèle.
Shrimperator

Ok je vais essayer cela. Je vous remercie.
Bruno Barral

Dans d'autres langues

Cette page est dans d'autres langues

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