Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:未调用IValueConverter_C#_Wpf_Button_Converter - Fatal编程技术网

C# WPF:未调用IValueConverter

C# WPF:未调用IValueConverter,c#,wpf,button,converter,C#,Wpf,Button,Converter,我试图根据ObservableCollection的“已更改”条件更改按钮的“背景”。我的ViewModel上有一个“IsDirty”布尔属性,我确信它会在ObservableCollection更改时得到更新 但是,按钮的背景没有改变,而且似乎从未调用过“Convert”方法 我的转换器缺少什么?当ObservableCollection更改时,按钮的背景应更改为红色(IsDirty为真) 编辑 我更新了转换器以返回一个红色或绿色的值(而不是红色和透明的),并且按钮没有背景色,这会告诉我转换器

我试图根据ObservableCollection的“已更改”条件更改按钮的“背景”。我的ViewModel上有一个“IsDirty”布尔属性,我确信它会在ObservableCollection更改时得到更新

但是,按钮的背景没有改变,而且似乎从未调用过“Convert”方法

我的转换器缺少什么?当ObservableCollection更改时,按钮的背景应更改为红色(IsDirty为真)

编辑

我更新了转换器以返回一个红色或绿色的值(而不是红色和透明的),并且按钮没有背景色,这会告诉我转换器永远不会被调用

编辑2

添加了显示IsDirty属性的ViewModel代码

转换器

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");
        }