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}"
                  ...
                  />
              ...