WPF正在将Visiblity绑定到集合属性

本文关键字:集合 属性 绑定 Visiblity WPF | 更新日期: 2023-09-27 18:26:17

我有一个从CollectionViewGroup动态构建的ControlTemplate。

我希望只有当它的所有项都有一个特定的属性设置为true时,它的可见性才是true。我在某种程度上完成了这一点:

XAML

<Button Visibility="{Binding Path=Items, Converter={StaticResource AllAcceptedToVis}}" Click="Button_ShipmentComplete_Click" Width="150" Margin="100,0,0,0">Complete</Button>

C#

public class AllAcceptedToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var items = (IEnumerable<object>)value;
        return items.Cast<MyObject>().All(m => m.Accepted) ? Visibility.Visible : Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new InvalidOperationException("AllAcceptedToVisibilityConverter can only be used OneWay.");
    }
}

这是有效的,但仅在加载时有效。它在初始创建后不检查更改,我怀疑这是因为它绑定到地址列表(项)而不是属性,所以它实际上根本没有检测到地址列表中的更改(它们保持不变)。

我如何才能完成上述操作,但让绑定动态监视所有Items属性的更改?

WPF正在将Visiblity绑定到集合属性

这里的问题是,您正在绑定集合实例,因此只有当您将新集合分配给Items时,绑定才会重新评估。假设您只设置了一次Items,因此转换器将只调用一次。在修改集合时不会调用它,在修改集合中的项时也不会调用它。WPF绑定不支持那些类型的"深度"依赖关系,因此您需要找到不同的方法。

我建议在视图模型上维护一个单独的属性,例如AllItemsAccepted,您可以直接绑定到它。将由您来侦听Items上的添加、删除和替换,以及侦听Items中任何元素的属性更改。当发生这种变化时,必须重新评估AllItemsAccepted。不要忘记发出属性更改通知,以便重新评估AllItemsAccepted上的任何绑定。

请注意,MultiBinding(和IMultiValueConverter)的概念,但只有当您绑定到已知的固定值集(例如,两个或多个单独的属性)时,这些概念才有用;它们对动态集合没有帮助。我把它们带上来只是为了救你免于掉进兔子洞而空出来。

相关文章: