WPF连接数据触发器绑定
在我的应用程序中,当我的模型的WPF连接数据触发器绑定,wpf,xaml,data-binding,Wpf,Xaml,Data Binding,在我的应用程序中,当我的模型的IsChanged属性设置为True 我已经能够成功地为我的TextBox控件之一使用以下样式执行此操作: 注意数据触发器中firstnameichanged的硬编码绑定 我的模型上的每个属性都有自己的IsChanged属性,我正在使用这些属性进行更改跟踪,这是我的模型以及如何创建IsChanged属性的快速预览: public class Person { public string FirstName { get; set; } public b
IsChanged
属性设置为True
我已经能够成功地为我的TextBox
控件之一使用以下样式执行此操作:
注意数据触发器中firstnameichanged
的硬编码绑定
我的模型上的每个属性都有自己的IsChanged
属性,我正在使用这些属性进行更改跟踪,这是我的模型以及如何创建IsChanged属性的快速预览:
public class Person
{
public string FirstName { get; set; }
public bool FirstNameIsChanged { get; set; }
public string MiddleName { get; set; }
public bool MiddleNameIsChanged { get; set; }
public string LastName { get; set; }
public bool LastNameIsChanged { get; set; }
public int Age { get; set; }
public bool AgeIsChanged { get; set; }
public DateTime? DateOfBirth { get; set; }
public bool DateOfBirthIsChanged { get; set; }
}
例如,如果我有以下文本框
,并且我将标记
属性设置为“FirstName”,则如果FirstName被更改
属性设置为True
,则样式应将背景
属性设置为“红色”:
<TextBox x:Name="FirstNameTextBox"
Tag="FirstName"
Margin="3"
Height="23"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Style="{DynamicResource TextBoxTestStyle}"
Text="{Binding FirstName,
Mode=TwoWay,
NotifyOnValidationError=true,
ValidatesOnExceptions=true,
UpdateSourceTrigger=PropertyChanged}"/>
样式(如果它是可编码的)允许我在10个TextBox
控件上设置标记属性,但对于所有TextBox
控件,只有一个样式,而不必复制和粘贴样式10次。如果我决定将来向模型中添加其他属性,例如IsValid
属性或IsEnabled
属性,我还希望避免添加“锅炉板”代码
我有一些想法:
- 我是否可以在
属性的标记
值中添加“IsChanged”,并在绑定中使用生成的字符串?e、 g.标记(“FirstName”)+“IsChanged”=“firstnameichanged”字符串
- 从
中,我可以走到可视化树上,抓住样式
属性中已经存在的文本
,并将“IsChanged”添加到路径中吗?e、 g.BindingPath(“FirstName”)+“IsChanged”=“firstnameichanged”绑定
- 您不应该将其与布尔值进行比较。此外,为了使其通用,我将使标记文本框独立,例如IsChanged:
<Style x:Key="TextBoxTestStyle" TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Tag" Value="IsChanged">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
编辑
要保留布尔值,可以使用不太通用的解决方案。因为标记需要字符串,所以我添加了一个转换器(您也可以创建另一个需要布尔值的Dependency属性)
...
...
如果不涉及代码隐藏(参见我的评论),这可能是最短的解决方案。如果您没有将TextBox标记属性用于其他任何内容,也可以将样式设置为隐式。您不应该将其与布尔值进行比较。此外,为了使其通用,我将使标记文本框独立,例如IsChanged:
<Style x:Key="TextBoxTestStyle" TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Tag" Value="IsChanged">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
编辑
要保留布尔值,可以使用不太通用的解决方案。因为标记需要字符串,所以我添加了一个转换器(您也可以创建另一个需要布尔值的Dependency属性)
...
...
如果不涉及代码隐藏(参见我的评论),这可能是最短的解决方案。如果您没有将TextBox标记属性用于任何其他内容,您也可以将样式设置为隐式。此样式如何在我的“FirstNameTextBox”的DataContext中检查
FirstNameIsChanged
类型的boolean
属性是否设置为True
?我想检查布尔值,因为它是我模型中的一个属性,从我可以看到,这种样式正在检查标记
中的字符串
值“IsChanged”。@bluescakes啊,现在我知道你在做什么了。这在XAML中是不可能的,请参阅。使用上面的代码,您可以跳过布尔值,改为设置标记道具。我将编辑我的帖子,添加一个使用布尔值的示例,但它不会像普通的一样。无法使用动态绑定有点令人失望,但我确实喜欢解决方法,谢谢您的示例。:)该样式如何在我的“FirstNameTextBox”的DataContext中检查类型为boolean
的FirstNameIsChanged
属性是否设置为True
?我想检查布尔值,因为它是我模型中的一个属性,从我可以看到,这种样式正在检查标记
中的字符串
值“IsChanged”。@bluescakes啊,现在我知道你在做什么了。这在XAML中是不可能的,请参阅。使用上面的代码,您可以跳过布尔值,改为设置标记道具。我将编辑我的帖子,添加一个使用布尔值的示例,但它不会像普通的一样。无法使用动态绑定有点令人失望,但我确实喜欢解决方法,谢谢您的示例。:)
<Style x:Key="TextBoxTestStyle" TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Tag" Value="IsChanged">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
<....Resources>
<local:BoolToStringConverter x:Key="BoolToStringConverter"/>
<Style x:Key="TextBoxStyle" TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Tag" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</....Resources>
...
<TextBox
x:Name="FirstNameTextBox"
Tag="{Binding FirstNameIsChanged,
Converter={StaticResource BoolToStringConverter}}"
Style="{StaticResource TextBoxStyle}"
...
/>
<TextBox
x:Name="MiddleNameTextBox"
Tag="{Binding MiddleNameIsChanged,
Converter={StaticResource BoolToStringConverter}}"
Style="{StaticResource TextBoxStyle}"
...
/>
...