C# MVVM动态更改属性
我试图在输入名称“David”时动态更改此前景值: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
<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"));
}
}