C# WPF:未调用IValueConverter
我试图根据ObservableCollection的“已更改”条件更改按钮的“背景”。我的ViewModel上有一个“IsDirty”布尔属性,我确信它会在ObservableCollection更改时得到更新 但是,按钮的背景没有改变,而且似乎从未调用过“Convert”方法 我的转换器缺少什么?当ObservableCollection更改时,按钮的背景应更改为红色(IsDirty为真) 编辑 我更新了转换器以返回一个红色或绿色的值(而不是红色和透明的),并且按钮没有背景色,这会告诉我转换器永远不会被调用 编辑2 添加了显示IsDirty属性的ViewModel代码 转换器C# WPF:未调用IValueConverter,c#,wpf,button,converter,C#,Wpf,Button,Converter,我试图根据ObservableCollection的“已更改”条件更改按钮的“背景”。我的ViewModel上有一个“IsDirty”布尔属性,我确信它会在ObservableCollection更改时得到更新 但是,按钮的背景没有改变,而且似乎从未调用过“Convert”方法 我的转换器缺少什么?当ObservableCollection更改时,按钮的背景应更改为红色(IsDirty为真) 编辑 我更新了转换器以返回一个红色或绿色的值(而不是红色和透明的),并且按钮没有背景色,这会告诉我转换器
public class IsDirtyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return System.Convert.ToBoolean(value) ?
new SolidColorBrush(Colors.Red)
: new SolidColorBrush(Colors.Green);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
看法
我认为你没有把这个装订好。试试这个:
Background="{Binding IsDirty, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IsDirtyConverter}}"
调试项目时,应检查输出窗口,查看是否有任何绑定错误。从绑定中删除
RelativeSource={RelativeSource Self}
。此代码使绑定搜索在按钮内而不是在其DataContext中
Background="{Binding
Path=IsDirty,
UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource IsDirtyConverter}}"
或使用
Background="{Binding
RelativeSource={RelativeSource Self},
Path=DataContext.IsDirty,
UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource IsDirtyConverter}}"
IsDirty也应该是属性而不是变量
private bool _isDirty;
public bool IsDirty
get
{
return _isDirty;
}
set
{
_isDirty = value
_codeCollection = value;
RaisePropertyChanged("IsDirty");
}
看起来,
IsDirty
没有更改通知。您是否在ViewModel上实现了INotifyPropertyChanged?如果它是在ViewModelBase
中实现的:我看不到任何这样的代码当您更改IsDirty
时调用code>。因此,很可能没有调用转换器,因为它不知道IsDirty
已更改。调试输出中有任何绑定错误吗?@Chris None,我可以找到与原始代码相同的结果,未点击Convert方法来查找应用于背景的颜色。UpdateSourceTrigger=PropertyChanged修复了我的问题。为什么它不是默认设置的,希望我们设置这个值?谢谢。这是在IsDirty.set中不具有RaisePropertyChanged调用和具有Path=DataContext.IsDirty的组合。不确定“DataContext”指的是什么,但它不是包含集合的数据上下文。此处组合框的DataContext将是您的视图DataContext,它是您的ViewModel
Background="{Binding
RelativeSource={RelativeSource Self},
Path=DataContext.IsDirty,
UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource IsDirtyConverter}}"
private bool _isDirty;
public bool IsDirty
get
{
return _isDirty;
}
set
{
_isDirty = value
_codeCollection = value;
RaisePropertyChanged("IsDirty");
}