【发布时间】:2015-10-28 14:11:01
【问题描述】:
我想要什么:
将一个可观察的集合绑定到一个属性(例如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();
}
}
什么有效:
- ListView 已正确更新
- 如果我不使用转换器类而是使用
Opacity="{Binding ObservableCollection.Count}",那么一旦第一个元素出现,不透明度就会从 0 变为 1
什么不起作用:
如果我使用转换器,Convert 只会在启动时调用一次,但不会在ListView 中出现新元素时调用
【问题讨论】:
-
Convert方法仅在引发属性更改事件时运行。您的ObservableCollection属性是否实现了INotifyPropertyChanged或者它是否得到了更新?请记住,添加/删除项目不会触发此事件。
标签: c# xaml data-binding