Collegamento pulsante di controlli per i dati (WPF)

0

Domanda

Sto lavorando su un'applicazione che mostra 20 grafico pulsanti, i controlli in un MainWindow (Button1 per Button20). Ogni pulsante di controllo in grado di visualizzare una stringa di Contenuto, e dispone di una descrizione comandi progettati, come segue :

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

Vorrei definire la stringa di contenuti e la stringa di descrizione comandi per ogni pulsante in un file XML in modo che questa informazione può essere cambiato modificando il file XML.

Per questo, ho creato un ViewModel definizione di un oggetto chiamato Bouton (in francese) :

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

Durante la lettura del file XML, ho creato il 20 oggetti di Bouton tipo con le informazioni su boutonNumber, il Contenuto e la descrizione dei comandi. Quindi tutti questi Bouton oggetti vengono memorizzati in un Elenco di raccolta.

Ora voglio usare il DataBinding tra il mio Bouton elenco e i controlli grafici sul mio MainWindow per essere in grado di visualizzare il contenuto della stringa e la stringa di descrizione comandi su ogni pulsante. In MainWindow, ho usato il seguente codice :

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

dove lst è un Elenco di raccolta correttamente inizializzata.

Ma non so come fare il databinding lavoro sul Pulsante controlla. Come posso fare ogni 20 controlli Pulsante correttamente il link alla corrispondente Bouton oggetto (contenuto nel Boutons collezione) ? Voglio dire, come controllo Button1 ottenere le sue corde dal mio Bouton1 oggetto, il controllo Button2 ottenere la sua stringa da Bouton2 oggetto e così via fino a quando Button20 di controllo e Bouton20 oggetto ?

Grazie per il vostro aiuto. Si prega di notare che io sono un principiante con WPF e questo è il mio primo progetto WPF con Visual Studio.

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

Migliore risposta

0

Credo che l'opzione più semplice sarebbe quello di avvolgere il pulsante in un UserControl.

Questo UserControl quindi contiene una proprietà di tipo Bouton (non grande denominazione btw. - anche se è una lingua diversa, il termine "pulsante" esiste già, quindi questo è un po ' ambigua. Come un non-madrelingua inglese me, mi consiglia, inoltre, di abituarsi alla denominazione in lingua inglese, ma vi farà risparmiare un sacco di mal di testa nel lungo periodo, ma che potrebbe essere soggettivo )

È quindi possibile associare direttamente alla proprietà in oggetto UserControl modello. Tutto quello che dovete fare è assegnare ad ogni UserControl il tasto corretto dei dati.

es.

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

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

e nel tuo UserControl del modello:

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

È quindi possibile inserire il controllo utente in XAML come questo:

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

<ctrls:CustomButton name="myFirstButton"/>

Ora tutto quello che dovete fare è assicurarsi che ogni CustomButton ha loro ParsedButtonData impostato il corrispondente pezzo di dati. È possibile impostare manualmente per ogni pulsante creato in XAML, oppure è possibile creare il CustomButtons C#, in primo luogo.

Se si creano i controlli utente in XAML, per esempio:

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

In alternativa, si potrebbe desiderare di guardare in estensione ItemsControl. E ' praticamente fatta per questo tipo di applicazione. ItemsControl ha un ItemsSource, che può essere qualsiasi tipo di raccolta come List<> o ObservableCollection<>. Si crea quindi i suoi figli da collezione, impostando la proprietà DataContext automaticamente al corrispondente elemento in detto elenco.

Esempi di questo sarebbe DataGrid o ListView. Trovo che sia un po ' più complicato, però, se si vogliono solo mettere un sacco di Pulsanti su una singola Vista.

2021-11-22 17:47:49

Apprezzo molto il vostro interesse per la mia domanda, la tua risposta e i dettagli di codice che hai dato in esso. Voglio provare il più presto possibile. Grazie mille per il vostro aiuto !
Bruno Barral

Ho provato questo codice di ieri. Ho ancora alcune domande : ho fatto la classe CustomButton inheritate dal Pulsante (piuttosto che da UserControl come hai suggerito), ma ho un messaggio di errore sull'evento Click che ha detto di non essere presente nel CustomButton classe. Sono sorpreso dal momento che la classe base (Pulsante) è l'evento Click di attuazione. Ho provato a chiamare di base.Fare clic su() dal CustomButton ma ho ancora ottenere un messaggio di errore. Non capisco perché fare Clic evento non esiste CustomButton, come esiste in classe Button.
Bruno Barral

Perché non utilizzare un UserControl invece di ereditare dal Pulsante? In un UserControl, è un facile registrare un evento click di un tasto qualsiasi si inserisce nel modello.
Shrimperator

Ok cercherò di questa. Grazie.
Bruno Barral

In altre lingue

Questa pagina è in altre lingue

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