La vinculación de los controles de botón de datos (WPF)

0

Pregunta

Estoy trabajando en una aplicación que muestra 20 gráfico botones de los controles de una ventana principal (Button1 para Button20). Cada uno de los botones de control puede mostrar una cadena de Contenido, y tiene descripción diseñado como sigue :

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

Me gustaría definir la cadena de contenido y la descripción de la cadena para cada botón en un archivo XML por lo que esta información puede cambiar modificando el archivo XML.

Para esto, he creado un ViewModel la definición de un objeto llamado Bouton (en francés) :

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

Al leer el archivo XML, puedo crear 20 objetos de Bouton tipo con la información acerca de boutonNumber, el Contenido y la información sobre herramientas. A continuación, todos estos Bouton objetos se almacenan en una Lista de la colección.

Ahora quiero utilizar el Enlace de datos entre mi Bouton lista y de los controles gráficos en mi MainWindow a ser capaz de mostrar el contenido de la cadena y la cadena de información sobre herramientas en cada botón. En la ventana principal, he utilizado el siguiente código :

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

donde lst es una colección de listas inicializado correctamente.

Pero no sé cómo hacer que el enlace de datos de trabajo en los controles de Botón. ¿Cómo puedo hacer que cada uno de los 20 controles de Botón correctamente enlace a la correspondiente Bouton objeto (contenida en el Boutons de la colección) ? Me refiero a ¿cómo puede el control Button1 obtener sus cuerdas de mi Bouton1 objeto, Button2 de control de obtener su cadena de Bouton2 objeto y así sucesivamente hasta que Button20 de control y Bouton20 objeto ?

Gracias por su ayuda. Tenga en cuenta que yo soy un principiante con WPF y este es mi primer proyecto de WPF con Visual Studio.

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

Mejor respuesta

0

Creo que la opción más sencilla sería envolver su botón en un control de usuario.

Este control de usuario, a continuación, contiene una propiedad de tipo Bouton (no gran nomenclatura por cierto. - incluso si se trata de un idioma diferente, el término "botón" que ya existe, así que esto es bastante ambiguo. Como un no-hablante nativo de inglés, yo también recomiendo a acostumbrarse a la nomenclatura en inglés, que le ahorrará muchos dolores de cabeza en el largo plazo, pero que podría ser subjetiva )

Usted puede enlazar directamente a la propiedad en el control de usuario de la plantilla. Todo lo que tienes que hacer es asignar a cada objeto UserControl el botón correcto de los datos.

por ejemplo.

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

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

y en el UserControl de la plantilla:

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

A continuación, puede colocar el objeto UserControl en XAML como este:

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

<ctrls:CustomButton name="myFirstButton"/>

Ahora todo lo que tienes que hacer es asegurarse de que cada CustomButton tiene su ParsedButtonData establece en la correspondiente pieza de datos. Puede establecer manualmente para cada botón creado en XAML, o puede crear el CustomButtons a través de C# en el primer lugar.

Si usted crear sus Controles en XAML, por ejemplo:

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

Alternativamente, usted puede desear mirar en la ampliación de ItemsControl. Es, básicamente, para este tipo de aplicación. ItemsControl tiene un ItemsSource, que puede ser cualquier tipo de colección, tales como List<> o ObservableCollection<>. A continuación, se crea a sus hijos de esa colección, establecer el DataContext automáticamente al elemento correspondiente en la lista.

Los ejemplos de que sería DataGrid o ListView. Me parece que para ser un poco más complicado, sin embargo, si usted realmente desea colocar un montón de Botones en una sola Vista.

2021-11-22 17:47:49

Realmente aprecio su interés por mi pregunta, su respuesta y los detalles de código que se dio en ella. Voy a darle una oportunidad tan pronto como sea posible. Muchas gracias por tu ayuda !
Bruno Barral

He probado este código de ayer. Todavía tengo algunas preguntas : hice la clase CustomButton inheritate de Botón (en lugar de a partir de UserControl como usted sugiere), pero tengo un mensaje de error acerca de haga Clic en evento que se dice que no se presente en el CustomButton clase. Estoy sorprendido ya que la clase base (Botón) tiene el evento Click implementado. Traté de llamar a la base.Haga clic en() de la CustomButton pero todavía se me pone un mensaje de error. No entiendo por qué haga Clic en evento no existe en CustomButton, como sí existe en el Botón de la clase.
Bruno Barral

Por qué no utilizar un control de usuario en lugar de heredar de Botón? En un control de usuario, fácil de registrar un evento click para cualquier botón se coloca en la plantilla.
Shrimperator

Ok voy a probar esto. Gracias.
Bruno Barral

En otros idiomas

Esta página está en otros idiomas

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