C# MVVM动态更改属性

C# MVVM动态更改属性,c#,wpf,mvvm,C#,Wpf,Mvvm,我试图在输入名称“David”时动态更改此前景值: <RichTextBox x:Name="richTextBox" Height="100" Width="366"> <FlowDocument> <Paragraph> <Run Text="{Binding Customer.Name, UpdateSourceTrigger=PropertyChanged, Validate

我试图在输入名称“David”时动态更改此前景值:

<RichTextBox x:Name="richTextBox" Height="100" Width="366">
        <FlowDocument>
            <Paragraph>
                <Run Text="{Binding Customer.Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Foreground="{Binding Customer.TColor}"/>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>

如果我遗漏了代码的一个细节,整个项目可以在

上找到,但我不确定程序应该做什么,但我看到了两个问题:

  • 您分配了两次
    UpdateCommand
    ,因此您的
    ChangeColor
    永远不会被删除 上班
  • t颜色
    属性设置器中,您不使用

另外,
RichTextBox
中的绑定也存在问题。删除或更改“David”后,将拆分或完全删除运行的
。只需使用另一个绑定到
Name
TextBox
进行尝试,并观察其行为

不完全确定该程序应该做什么,但我发现了两个问题:

  • 您分配了两次
    UpdateCommand
    ,因此您的
    ChangeColor
    永远不会被删除 上班
  • t颜色
    属性设置器中,您不使用

另外,
RichTextBox
中的绑定也存在问题。删除或更改“David”后,将拆分或完全删除运行的
。只需使用另一个绑定到
Name
TextBox
进行尝试,并观察其行为

数据触发器如何

<Style TargetType="RichTextBox">
      <Setter Property="Foreground"
                  Value="PutYourdefaultColor" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding Customer.Name}"
                     Value="David">
          <Setter Property="Foreground"
                  Value="Green" />
        </DataTrigger>
      </Style.Triggers>
</Style>

数据触发器怎么样

<Style TargetType="RichTextBox">
      <Setter Property="Foreground"
                  Value="PutYourdefaultColor" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding Customer.Name}"
                     Value="David">
          <Setter Property="Foreground"
                  Value="Green" />
        </DataTrigger>
      </Style.Triggers>
</Style>

以下是执行此操作的方法

<RichTextBox x:Name="richTextBox" Height="100" Width="366">
  <FlowDocument>
    <Paragraph  Foreground="{Binding Customer.Color}">
      <Run Text="{Binding Customer.Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
    </Paragraph>
  </FlowDocument>
</RichTextBox>
这里是关键部分

    /// <summary>
    /// getter and setter
    /// </summary>
    public String Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
           PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Color"));
        }
    }
//
///接二连三
/// 
公共字符串名
{
得到
{
返回名称;
}
设置
{
名称=值;
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(“名称”);
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(“颜色”);
}
}
注意以下几点:

  • 前景色在段落上设置,而不是运行。由于某些原因,这在运行时不起作用
  • 设置名称时,您需要指示颜色已更改。否则颜色将不会更新

  • 下面是实现这一点的方法

    <RichTextBox x:Name="richTextBox" Height="100" Width="366">
      <FlowDocument>
        <Paragraph  Foreground="{Binding Customer.Color}">
          <Run Text="{Binding Customer.Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
        </Paragraph>
      </FlowDocument>
    </RichTextBox>
    
    这里是关键部分

        /// <summary>
        /// getter and setter
        /// </summary>
        public String Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
               PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Color"));
            }
        }
    
    //
    ///接二连三
    /// 
    公共字符串名
    {
    得到
    {
    返回名称;
    }
    设置
    {
    名称=值;
    PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(“名称”);
    PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(“颜色”);
    }
    }
    
    注意以下几点:

  • 前景色在段落上设置,而不是运行。由于某些原因,这在运行时不起作用
  • 设置名称时,您需要指示颜色已更改。否则颜色将不会更新

  • 你可以使用iValueConverter你可以使用iValueConverter据我所知,这种方法更好,但并不适用于所有出现的David,只要“D”是第一个字母。据我所知,这种方法更好,但不适用于所有出现的David,只要“D”是第一个字母
        /// <summary>
        /// getter and setter
        /// </summary>
        public String Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
               PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Color"));
            }
        }