【发布时间】:2017-12-18 10:23:29
【问题描述】:
我有一个非常简单的 IValueConverter,它将 IList<string> 转换为逗号分隔的字符串。问题是集合(它是一个 ObservableCollection)没有尝试更新文本,我可以判断,因为 IValueConverter 中的调试点显示在加载初始绑定后没有被调用。
转换器(这部分在实际调用时似乎工作正常)
public class CollectionToCommaSeperatedString : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return parameter.ToString();
if (((IList<string>)value).Count > 0)
return String.Join(", ", ((IList<string>)value).ToArray()) ?? parameter.ToString();
else
return parameter.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
绑定元素:
<TextBlock Text="{Binding SelectedChannels, ConverterParameter='(Click to select channels)', Converter={StaticResource CollectionToCommaSeperatedString}, ElementName=userControl, Mode=OneWay}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
属性的 CB:
public ObservableCollection<string> SelectedChannels
{
get { return (ObservableCollection<string>)GetValue(SelectedChannelsProperty); }
set { SetValue(SelectedChannelsProperty, value); }
}
public static readonly DependencyProperty SelectedChannelsProperty =
DependencyProperty.Register("SelectedChannels", typeof(ObservableCollection<string>), typeof(ChannelSelector), new PropertyMetadata(new ObservableCollection<string>()));
【问题讨论】:
-
你是如何更新
SelectedChannels的? -
@Sinatr .Add()/.Remove() 哪个“应该”触发更新,对吗?
-
@Sinatr 我知道 CollectionChanged 事件正在触发,因为我钩住了它并添加了控制台转储,看起来不错。
-
CollectionChanged 不会触发该绑定。
-
我想既然你绑定到
Text,那么绑定是忽略INotifyCollectionChanged。您将不得不使用 standard 程序(订阅事件)。
标签: c# wpf binding observablecollection ivalueconverter