繁体   English   中英

WPF将可见性绑定到集合属性

[英]WPF Binding Visiblity to Collection Property

我有一个从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属性的更改?

这里的问题是您要绑定到集合实例 ,因此绑定只会在是否以及何时向Items分配新集合时重新评估。 想必,你只设置Items一次,所以转换器将只调用一次。 修改集合时将不会调用它,也不会在修改集合中的项目时调用它。 WPF绑定不支持那种“深层”依赖关系,因此您将需要找到另一种方法。

我建议在视图模型上维护一个单独的属性,例如AllItemsAccepted ,可以直接绑定到该属性。 这将是由你来听添加,删除和替换上的Items ,并听取对任何内的元素的属性更改Items 发生此类更改时,必须重新评估AllItemsAccepted 不要忘记引发属性更改通知,以便重新评估AllItemsAccepted上的任何绑定。

请注意, 一个的概念MultiBinding (和IMultiValueConverter ),但这些仅是有用的,如果要针对一个已知的,固定的一组值 (例如,两个或更多个单独的属性) 约束力; 他们不会帮助您进行动态收藏。 我只是带他们上来,以免您掉下兔子洞而空着。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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