数据绑定+转换器不会更新绑定属性 - XAML - WPF

时间:2015-10-28 14:11:01

标签: c# xaml data-binding

我想要的是什么:

将可观察集合绑定到属性(例如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();
}
}

什么有效:

  1. ListView已正确更新
  2. 如果我不使用转换器类但使用Opacity="{Binding ObservableCollection.Count}",则只要第一个元素显示,不透明度就会从0变为1
  3. 什么不起作用 如果我使用转换器,Convert在启动时只调用一次但在ListView

    中出现新元素时不会被调用

1 个答案:

答案 0 :(得分:2)

很可能你的集合没有改变(我的意思是对你的集合的引用)所以你必须实现机制来处理集合改变事件(在添加或删除值时触发)

注意:在这两种情况下,您都需要更改转换器以直接使用计数

所以你应该能够像这样,如果它没有用 - &gt;这意味着该集合在计数变化时不会通知你进入下面描述的更长的道路:

bundle install

如果以上情况不起作用,我会这样做:

创建新媒体资源 - &gt;我将在VM中绑定CollectionCount

<ImageBrush ImageSource="assets/Tapako.ico" 
            Opacity="{Binding ObservableCollection.Count, Converter={StaticResource IsNullToFloatConverter}}" Stretch="None">
</ImageBrush>

更改绑定以使用它而不是整个集合

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>