繁体   English   中英

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

[英]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();
}
}

什么有效:

  1. ListView已正确更新
  2. 如果我不使用转换器类,而是使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM