将按钮控件链接到数据 (WPF)

Posted

技术标签:

【中文标题】将按钮控件链接到数据 (WPF)【英文标题】:Linking button controls to data (WPF) 【发布时间】:2022-01-01 05:29:01 【问题描述】:

我正在开发一个在 MainWindow(Button1 到 Button20)中显示 20 个图形按钮控件的应用程序。 每个按钮控件都可以显示一个内容字符串,并具有如下设计的工具提示:

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

我想为 XML 文件中的每个按钮定义字符串内容和工具提示字符串,以便可以通过修改 XML 文件来更改此信息。

为此,我创建了一个 ViewModel,定义了一个名为 Bouton(法语)的对象:

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;
    

在读取 XML 文件时,我创建了 20 个 Bouton 类型的对象,其中包含有关 boutonNumber、Content 和 Tooltip 的信息。然后将所有这些 Bouton 对象存储到一个 List 集合中。

现在我想在我的 Bouton 列表和 MainWindow 上的图形控件之间使用 DataBinding,以便能够在每个按钮上显示内容字符串和工具提示字符串。 在 MainWindow 中,我使用了以下代码:

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

其中 lst 是一个正确初始化的 List 集合。

但我不知道如何在 Button 控件上进行数据绑定。如何使 20 个 Button 控件中的每一个都正确链接到相应的 Bouton 对象(包含在 Boutons 集合中)?我的意思是 Button1 控件如何从我的 Bouton1 对象获取其字符串,Button2 控件如何从 Bouton2 对象获取其字符串,依此类推,直到 Button20 控件和 Bouton20 对象?

感谢您的帮助。请注意,我是 WPF 的初学者,这是我使用 Visual Studio 进行的第一个 WPF 项目。

【问题讨论】:

【参考方案1】:

我认为最简单的选择是将按钮包装在 UserControl 中。

然后这个 UserControl 包含一个Bouton 类型的属性(顺便说一句不是很好的命名。 - 即使它是一种不同的语言,术语“按钮”已经存在,所以这是相当模棱两可的。作为一个非我自己是母语为英语的人,我也建议习惯用英语命名,从长远来看,它会为你省去很多麻烦,但这可能是主观的)

然后您可以直接绑定到 UserControl 模板中的该属性。您所要做的就是为每个 UserControl 分配正确的按钮数据。

例如。

public class CustomButton : UserControl

    public Bouton ParsedButtonData  get; set; 

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

在您的 UserControl 模板中:

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

然后您可以像这样将 UserControl 放在您的 XAML 中:

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

&lt;ctrls:CustomButton name="myFirstButton"/&gt;

现在您要做的就是确保每个 CustomButton 都将其 ParsedButtonData 设置为相应的数据。您可以为 XAML 中创建的每个按钮手动设置此项,也可以首先通过 C# 创建自定义按钮。

如果您在 XAML 中创建用户控件,例如:

public void SomeMethod()

    myFirstButton.ParsedButtonData = lst[0];

或者,您可能想考虑扩展ItemsControl。它基本上是为这种应用程序而设计的。 ItemsControl 有一个 ItemsSource,它可以是任何集合类型,例如 List&lt;&gt;ObservableCollection&lt;&gt;。然后它从该集合中创建其子项,将 DataContext 自动设置为所述列表中的相应元素。

例如DataGridListView。不过,如果您真的只想在单个视图上放置一堆按钮,我发现这涉及更多一点。

【讨论】:

非常感谢您对我的问题、您的回答以及您在其中提供的代码细节感兴趣。我会尽快试一试。非常感谢您的帮助! 我昨天试过这个代码。我还有一些问题:我让 CustomButton 类继承自 Button (而不是像您建议的那样从 UserControl 继承),但我有一条关于 Click 事件的错误消息,据说该事件不存在于 CustomButton 类中。我很惊讶,因为基类 (Button) 实现了 Click 事件。我试图从 CustomButton 调用 base.Click() 但我仍然收到一条错误消息。我不明白为什么CustomButton中不存在Click事件,因为它确实存在于Button类中。 为什么不使用 UserControl 而不是从 Button 继承?在 UserControl 中,您可以轻松地为放置在模板中的任何按钮注册单击事件。 好的,我会试试这个。谢谢。

以上是关于将按钮控件链接到数据 (WPF)的主要内容,如果未能解决你的问题,请参考以下文章

wpf usercontrol,将按钮的命令参数绑定到父用户控件

如何将WPF中的命令绑定到控件的双击事件处理程序

将按钮添加到 WPF DataGrid

通过按钮进行 WPF 导航

关于WPF添加按钮

在WPF中 有如下两个控件 面板是canvas 问题是 我想将左上角控件的绿端链接到右下角的红端,用折线链接