一旦属性更新,为什么我的转换器不会触发?

时间:2018-02-02 13:26:18

标签: c# wpf

为了简要说明我的问题,我有一个标签,我想以" Item1,Item2,Item3等格式显示ObservableCollection列表的内容"。

所以我的XAML看起来像这样。代码缩短了可读性。

<Window.Resources>
    <c:ListToString x:Key="ToList"></c:ListToString>
</Window.Resources>

<Label x:Name="yaxisTxt" Content="{Binding Path=YAxisVariables, Converter={StaticResource ToList}}">

YAxisVariables是ObservableCollection。我的VM看起来像这样,再次缩短。

class ChartVM : INotifyPropertyChanged
{
    ObservableCollection<string> _yaxisvars;
    public ObservableCollection<string> YAxisVariables
    {
        get
        {
            return (_yaxisvars);
        }
        set
        {
            _yaxisvars = value;
            OnPropertyChanged("YAxisVariables");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string PropName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropName));
        }
    }
}

我的转换器看起来像这样。我希望标签显示&#34;拖动变量&#34;如果ObservableCollection为空,并显示集合的值,如果它不为空。

public class ListToString : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is ObservableCollection<string>)
        {
            ObservableCollection<string> vars = (ObservableCollection<string>)value;
            if (vars.Count > 0)
            {
                string series = null;
                foreach (string var in vars)
                {
                    if (series != null)
                        series = series + ", " + var;
                    else
                        series = var;
                }
                series.Trim(',');
                series.Trim(' ');

                return series;
            }
            else
                return "Drag variable";
        }

        return null;

    }


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

我的问题是,当加载表单并且列表为空时,转换器正确触发并且标签显示&#34;拖动变量&#34;,但是当更新列表并且属性发生更改时,转换器会执行不要开火。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

对于集合,您需要3种绑定/更改通知:

  1. 对集合的更改(添加,删除)。这是ObservableCollection唯一需要解决的问题
  2. 更改公开集合的属性的通知。 OC暴露时批量修改是非常糟糕的。因此,当您想要进行批量修改时,最好在View Model中构建它,然后在完全构建时公开它。
  3. 更改您在ObservableCollection
  4. 中保留的班级的每个属性的通知

    其他注意事项:

    您对属性名称字符串进行了硬编码。 C#添加了语法,所以你永远不必这样做。您肯定应该使用[CallerMemberName]和类似的东西来使您的代码重构安全并避免拼写错误。

    实际上没有任何东西可以绑定到简单的集合。 WPF元素只能绑定到CollectionViews。但是如果你给他们一个随机的集合,他们就不会犹豫从它那里制作一个CollectionView。对于高级内容(更改/跟踪所选元素,过滤,排序),您必须控制该步骤并自行创建CollectionView:https://wpftutorial.net/DataViews.html