我对WPF数据绑定/样式/模板很陌生,现在我想使用一个样式(Style)应用一组属性值到按钮上。该样式绑定到一个类的字段。如您所见,这对BackColor属性起作用。但是,当我尝试设置TextBlock的文本时,它不起作用(也没有绑定错误)。我的最终目标是能够将图像设置为内容。
如果我不使用DataTemplate,并使用SetterProperty =“Content”而不是“ContentTemplate”,它将适用于一个按钮,但是添加第二个按钮时会给出运行时错误“指定的元素已成为另一个元素的逻辑子元素,请先断开连接。”
我漏掉了什么?我应该把什么放入“TextBlock Text=”中?
顺便说一句,一旦完成,我希望将样式移到全局范围内,因此我不想使用任何明确引用MyClass的东西。
<Window.Resources>
<Style TargetType="Button" x:Key="MyStyle">
<Setter Property="Background" Value="{Binding BackColor}"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="XYZ-"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel Orientation="Horizontal" Height="30">
<Button Style="{StaticResource MyStyle}" DataContext="{Binding Action1}"/>
<Button Style="{StaticResource MyStyle}" DataContext="{Binding Action1}"/>
<Button Style="{StaticResource MyStyle}" DataContext="{Binding Action2}"/>
<Button Style="{StaticResource MyStyle}" DataContext="{Binding Action2}"/>
</StackPanel>
并且
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
Action1 = new MyClass() { Text = "ACTION1", BackColor = new SolidColorBrush(Colors.Red) };
Action2 = new MyClass() { Text = "ACTION2", BackColor = new SolidColorBrush(Colors.Green) };
}
public MyClass Action1{get; private set;}
public MyClass Action2{get; private set;}
}
public class MyClass
{
public string Text { get; set; }
public Brush BackColor { get; set; }
}