Ligando o botão de controle de dados (WPF)

0

Pergunta

Eu estou trabalhando em um aplicativo mostrando 20 gráfico botões de controles em um MainWindow (Button1 para Button20). Cada botão de controle pode exibir uma cadeia de caracteres de Conteúdo, e tem uma dica de ferramenta concebida como a seguir :

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

Eu gostaria de definir o conteúdo de seqüência de caracteres e a cadeia de descrição para cada botão em um arquivo XML, de modo que esta informação pode ser alterada modificando o arquivo XML.

Para isso, criou uma ViewModel de definir um objeto chamado Bouton (em 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;
    }
}

Durante a leitura do arquivo XML, criar objectos de 20 de Bouton tipo com as informações sobre boutonNumber, o Conteúdo e a Dica de ferramenta. Em seguida, todos estes Bouton objetos são armazenados em uma coleção de Lista.

Agora eu quero usar ligação de dados entre o meu Bouton lista e os controles de gráficos no meu MainWindow para ser capaz de exibir o conteúdo de cadeia e a cadeia de descrição em cada botão. No MainWindow, eu usei o seguinte código :

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

onde lst é uma coleção de Lista inicializado corretamente.

Mas eu não sei como fazer a ligação de dados funciona no os controles de Botão. Como posso fazer para que cada um dos 20 controles de Botão de ligar correctamente para o correspondente Bouton (objeto contido no Boutons coleção) ? Quero dizer, como pode controlo Button1 obter suas cordas do meu Bouton1 objeto, o controle Button2 obter a sua cadeia de Bouton2 objeto e assim por diante, até Button20 de controle e Bouton20 objeto ?

Obrigado por sua ajuda. Por favor, note que eu sou um novato com WPF e este é o meu primeiro projeto do WPF com o Visual Studio.

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

Melhor resposta

0

Eu acho que a opção mais simples seria a de moldar o botão em um UserControl.

Este UserControl contém uma propriedade de tipo de Bouton (não é grande nomenclatura btw. - mesmo se ele for um idioma diferente, o termo "botão" já existe, então isso é bastante ambígua. Como um não-falante nativo de inglês, eu também recomendo começar usado a nomenclatura em inglês, ela vai lhe poupar muitas dores de cabeça a longo prazo, mas que pode ser subjetiva )

Em seguida, você pode ligar diretamente para que a propriedade UserControl do modelo. Tudo que você tem a fazer é atribuir a cada um UserControl o botão correto de dados.

por exemplo.

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

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

e em seu UserControl do modelo:

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

Você pode, em seguida, coloque o UserControl em seu XAML como este:

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

<ctrls:CustomButton name="myFirstButton"/>

Agora tudo que você tem a fazer é se certificar de que cada CustomButton tem sua ParsedButtonData definido para o correspondente conjunto de dados. Você pode definir isso manualmente para cada botão criado em seu XAML, ou você pode criar o CustomButtons através de C# em primeiro lugar.

Se você criar seu UserControls no XAML, por exemplo:

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

Como alternativa, você pode querer olhar para estender ItemsControl. É basicamente feito para este tipo de aplicação. Um ItemsControl tem um ItemsSource, que pode ser qualquer tipo de coleção, como List<> ou ObservableCollection<>. Em seguida, ele cria seus filhos de que a coleta, definindo o DataContext automaticamente para o elemento correspondente em lista.

Exemplos do que seria DataGrid ou ListView. Eu acho que para ser um pouco mais envolvido, porém, se você realmente deseja colocar um monte de Botões em um único modo de Exibição.

2021-11-22 17:47:49

Eu realmente aprecio o seu interesse para a minha pergunta, a sua resposta e os detalhes do código que você deu nele. Eu vou dar uma chance assim que possível. Muito obrigado por sua ajuda !
Bruno Barral

Eu tentei este código de ontem. Eu ainda tenho algumas dúvidas : eu fiz a classe CustomButton inheritate do Botão (em vez do UserControl como você sugeriu), mas eu tenho uma mensagem de erro sobre o evento de Clique é dito não estar presente no CustomButton classe. Estou surpreso, pois a classe base (Botão) tem o evento de Clique implementado. Eu tentei ligar para a base.Clique em() a partir do CustomButton mas eu ainda recebo uma mensagem de erro. Eu não entendo por evento de Clique não existe no CustomButton, como ele não existe na classe de Botão.
Bruno Barral

Por que você não use um UserControl em vez de herdar de Botão? Em um UserControl, pode facilmente registar um evento de clique de botão, colocar no modelo.
Shrimperator

Ok, vou tentar isso. Obrigado.
Bruno Barral

Em outros idiomas

Esta página está em outros idiomas

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