直接 属性 绑定更新,DataContext 绑定不更新
Direct property binding updates, DataContext binding doesn't
我正在将 TextBlock
的 Text
属性 绑定到 ObservableCollection
,即 属性 的 属性查看模型;通过这个 ValueConverter
:
精确到它的长度
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}}" />
这仅部分有效 - 值最初设置正确,但在集合更改时从未更新。
我在这里错过了什么?我怎样才能让它随着集合中的变化而更新?
感谢您的帮助!
正如我在对原始问题的评论中所述,您可以将 TextBlock.Text
依赖项 属性 直接绑定到集合的 Count
属性,这样您就不必需要任何转换器。由于 ObservableCollection
实现引发 Count
属性 的 PropertyChanged
事件,您应该更新绑定目标。
<TextBlock DataContext="{Binding SubViewModel.Collection}" Text="{Binding .Count}" />
我正在将 TextBlock
的 Text
属性 绑定到 ObservableCollection
,即 属性 的 属性查看模型;通过这个 ValueConverter
:
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}}" />
这仅部分有效 - 值最初设置正确,但在集合更改时从未更新。
我在这里错过了什么?我怎样才能让它随着集合中的变化而更新?
感谢您的帮助!
正如我在对原始问题的评论中所述,您可以将 TextBlock.Text
依赖项 属性 直接绑定到集合的 Count
属性,这样您就不必需要任何转换器。由于 ObservableCollection
实现引发 Count
属性 的 PropertyChanged
事件,您应该更新绑定目标。
<TextBlock DataContext="{Binding SubViewModel.Collection}" Text="{Binding .Count}" />