【问题标题】:Converter on a get-only property is not called (WPF)未调用 get-only 属性上的转换器 (WPF)
【发布时间】:2016-10-16 17:47:03
【问题描述】:

我有以下这个 XAML:

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

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

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 框架不知道该属性何时更改。对吗?

【问题讨论】:

  • 您必须在您的类中实现INotifyPropertyChanged 接口,并确保在您更改属性时触发PropertyChanged 事件。使用 =&gt; 表示法的自动表达式不适合这里。
  • 此外,对于 WPF 数据绑定,CurrentJob 必须是公共属性,而不是私有字段。

标签: c# wpf xaml converter ivalueconverter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-02
      • 2013-06-21
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多