[英]Data Binding + Converter doesn't update bound property - XAML - WPF
我想要的是:
将可观察的集合绑定到属性(例如Opacity
),该属性应采用转换器类的返回值。
XAML代码:
<ListBox x:Name="HostDeviceList"
ItemsSource="{Binding ObservableCollection}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.Background>
<ImageBrush ImageSource="assets/Tapako.ico"
Opacity="{Binding ObservableCollection, Converter={StaticResource IsNullToFloatConverter}}" Stretch="None">
</ImageBrush>
</ListBox.Background>
我的转换器课程:
public class IsNullToFloatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
float lowValue = 0.1f;
float highValue = 0.5f;
if (parameter is float && value != null)
{
return parameter;
}
else
{
if (value is IEnumerable)
{
if (((IEnumerable)value).Any())
{
return lowValue;
}
else
{
return highValue;
}
}
if (value != null)
{
return lowValue;
}
else
{
return highValue;
}
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
什么有效:
Opacity="{Binding ObservableCollection.Count}"
,则第一个元素出现后,不透明度就会从0变为1。 什么不起作用:如果我使用转换器,则在启动时只调用一次Convert
,但是在ListView
出现新元素时不调用Convert
您的集合很可能没有发生变化(我是指对集合的引用),因此您必须实现一种机制来处理集合更改事件(在添加或删除值时触发)
注意:在两种情况下,您都需要更改转换器以直接使用计数
因此 ,如果它无法解决问题, 那么您应该能够做到这一点 ->意味着该集合在计数更改时不会通知您,您需要走更长的路,如下所述:
<ImageBrush ImageSource="assets/Tapako.ico"
Opacity="{Binding ObservableCollection.Count, Converter={StaticResource IsNullToFloatConverter}}" Stretch="None">
</ImageBrush>
如果上述方法不起作用,我会这样做:
创建一个新属性->我将在VM中将CollectionCount绑定到的新属性
public int collectionCount;
public int CollectionCount
{
get
{
return collectionCount;
}
set
{
collectionCount = value;
RaisePropertyChanged("CollectionCount");
}
}
更改绑定以使用它而不是整个集合
<ImageBrush ImageSource="assets/Tapako.ico"
Opacity="{Binding CollectionCount, Converter={StaticResource IsNullToFloatConverter}}" Stretch="None">
</ImageBrush>
注册收集更改并创建一个处理程序,该处理程序会将计数赋予您的属性,该属性将在更改时触发并调用转换器
ObservableCollectionProp.CollectionChanged += CollectionChangedHandler;
private void CollectionChangedHandler(object sender, NotifyCollectionChangedEventArgs e)
{
CollectionCount = ObservableCollectionProp.Count;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.