直接属性绑定更新,DataContext绑定没有
问题描述:
我将TextBlock
的Text
属性绑定到ObservableCollection
,它是ViewModel属性的属性;通过准确的说其长度此ValueConverter
:直接属性绑定更新,DataContext绑定没有
public class EnumerableToCountConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (null == value ? 0 : ((IEnumerable<object>)value).Count());
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
能正常工作和更新适当的时候用下面的XAML集合的变化:现在
<TextBlock Text="{Binding SubViewModel.Collection, Converter={StaticResource EnumerableToCountConverter}}" />
,因为我还需要参考其他地方,我希望有集合作为控制的DataContext
和使用相对绑定路径:
<TextBlock DataContext="{Binding SubViewModel.Collection}"
Text="{Binding Path=., Converter={StaticResource EnumerableToCountConverter}}" />
这只能部分 - 值集合C或者最初是正确的,但在收集更改时从未更新过。
我在这里错过了什么?我还能如何通过集合中的更改来更新?
感谢您的帮助!
答
正如我在对原始问题的评论中所述,您可以将您的TextBlock.Text
依赖属性直接绑定到集合的Count
属性,因此您不需要任何转换器。并且由于ObservableCollection
实现引发了Count
属性的PropertyChanged
事件,因此应该更新绑定目标。
<TextBlock DataContext="{Binding SubViewModel.Collection}" Text="{Binding .Count}" />
你是什么意思的“集合变化”:收集项目添加/删除或分配一个新的集合?第二个问题:为什么不把你的'TextBlock.Text'绑定到'SubViewModel.Collection.Count'? – dymanoid 2015-02-12 09:25:45
是的,项目被添加或删除;集合保持不变。我并没有将'Count'绑定到仅仅是因为我没有想到它 - 当然,这是可能的,它实际上似乎解决了这个问题,因为当集合被设置为'DataContext'时它正确更新。所以,如果您将此作为答案发布,我可以接受。 – TeaDrivenDev 2015-02-12 15:21:06