WPF绑定对集合属性的可见性

时间:2014-10-10 17:10:07

标签: c# wpf list xaml binding

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

我希望只有当所有项目的某个属性设置为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)而不是属性,所以它实际上检测到地址列表中没有任何变化(它们保持不变)。 / p>

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

1 个答案:

答案 0 :(得分:1)

此处的问题是您绑定了集合实例,因此绑定只会在您将新集合分配给Items时重新评估。据推测,您只需设置Items一次,因此转换器只会被调用一次。修改集合时不会调用它,也不会在修改集合中的项目时调用它。 WPF绑定不支持那些“深层”依赖,因此您需要找到不同的方法。

我建议您在视图模型上维护一个单独的属性,例如AllItemsAccepted,您可以直接绑定它。您可以在Items上收听添加,删除和替换,并监听Items中任何元素的属性更改。发生此类更改时,您必须重新评估AllItemsAccepted。不要忘记提出属性更改通知,以便重新评估AllItemsAccepted上的任何绑定。

请注意, MultiBinding(和IMultiValueConverter)的概念,但只有在绑定已知的固定集时才有用值(例如,两个或多个单独的属性);他们不会帮助你动态收藏。我只是把它们带出去,以免你从兔子洞里走出来然后空着。