为什么在Collection更改时不调用Converter?

Ant*_*ien 4 data-binding wpf

我做了一个CollectionToStringConverter可以将任何转换IList成逗号分隔的字符串(例如"Item1,Item2,Item3").

我这样使用它:

<TextBlock Text="{Binding Items, 
                  Converter={StaticResource CollectionToStringConverter}}" />
Run Code Online (Sandbox Code Playgroud)

上面的工作,但只有一次我加载UI.Items是一个ObservableCollection.文本块不会更新,并且在添加或删除时不会调用转换器Items.

知道缺少什么使这项工作?

Ken*_*art 6

绑定是产生集合的属性.它将在集合实例本身更改时生效,而不是在集合中的项目发生更改时生效.

有很多方法可以实现您想要的行为,包括:

1)绑定ItemsControl到集合并配置ItemTemplate输出以逗号开头的文本(如果它不是集合中的最后一项).就像是:

<ItemsControl ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
        <TextBlock>
            <TextBlock Visibility="{Binding RelativeSource={RelativeSource PreviousData}, Converter={StaticResource PreviousDataConverter}}" Text=", "/>
            <TextBlock Text="{Binding .}"/>
        </TextBlock>
    </ItemsControl.ItemTemplate>    
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

2)在代码隐藏中编写代码以观察集合的更改并更新将项目连接成一个单独的属性string.就像是:

public ctor()
{
    _items = new ObservableCollection<string>();

    _items.CollectionChanged += delegate
    {
        UpdateDisplayString();
    };
}

private void UpdateDisplayString()
{
    var sb = new StringBuilder();

    //do concatentation

    DisplayString = sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

3)编写自己的ObservableCollection<T>子类,维护一个类似于#2的单独连接字符串.