不调用get-only属性上的转换器(WPF)

时间:2016-06-15 14:30:43

标签: c# wpf xaml converter ivalueconverter

我有以下这个XAML:

<ListBox Background="{Binding CurrentJob, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource JobToColorConverter}, Mode=TwoWay}">

我想根据ListBox属性更改CurrentJob背景。 以下是我的代码的一部分:

private Job CurrentJob => ((FooClass) WindowsPanel.Children[0]).CurrentJob;

这是我的(虚拟)转换器:

public class JobToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var j = (Job) value;
        return new SolidColorBrush(Color.FromArgb(100, 60, 116, 154))
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我验证了

现在,我的问题是当CurrentJob更改时,不会触发转换器事件,并且永远不会调用Convert方法。

我认为这是因为CurrentJob是一个只读属性,所以WPF框架不知道属性何时发生变化。这是对的吗?

2 个答案:

答案 0 :(得分:2)

private Job CurrentJob;需要触发PropertyChanged事件。从INotifyPropertyChanged接口继承您的类并以这种方式实现它:

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;

    if (handler != null)
    {
        handler( this, new PropertyChangedEventArgs(name) );
    }
}


private Job currentJob;

public Job CurrentJob
{
    get { return curentJob; }
    private set
    {
        if (this.currentJob != value)
        {
            this.currentJob = value;
            OnPropertyChanged("CurrentJob");
        }
    }
}

答案 1 :(得分:0)

您的财产是私有的,请尝试将其公开。

此外,鉴于该属性是只读的,并且不会传播来自((FooClass) WindowsPanel.Children[0]).CurrentJob的更改,您可以进行绑定OneTime。