[英]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.