有一个所有交易对手的列表Contractors
,有一个合作伙伴列表Partners
,第二个列表是第一个列表的子集,这两个属性都可用VM
。
In View
is ItemsControl
withCheckBox'ами
其中包含交易对手列表:
<ItemsControl ItemsSource="{Binding Contractors}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}">
...
</CheckBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我现在需要选中所有合作伙伴的复选框:
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource CheckPartnersConverter}">
<Binding Mode="OneWay"/>
<Binding Path="DataContext.Partners"
RelativeSource="{RelativeSource FindAncestor, AncestorType=ItemsControl}"/>
</MultiBinding>
</CheckBox.IsChecked>
在转换器中实现了该方法Convert
:
class CheckPartnersConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values[1] is List<Contractor> partners && values[0] is Contractor c)
return partners.Contains(c);
return false;
}
好的,这似乎有效。
现在如何实现反向转换,甚至有可能实现它?
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
var res = new object[]
{
Binding.DoNothing,
Binding.DoNothing
};
return res;
}
}
如果这不可能,我准备放弃带有复选框的演示文稿并替换它,例如,ListBox
只选择合作伙伴,但击败SelectionMode="Multiple"
也没有问题SelectedItems
好了,说到这里,其实问题可以有几种解决方法,其中一种是用
EventTrigger
,还有一种是用 (attached property
和behavior
) ,但其实这些解决方法的本质是差不多的。XAML
编码:接下来,
ViewModel
创建一个命令:作为此命令的参数
Action'
a,将有选定的条目PS 要与您一起工作
EventTrigger
,InvokeCommandAction
您必须拥有System.Windows.Interactivity
.此命名空间的
XAML
连接如下所示:为了使对属性的绑定
SelectedItems
在两个方向上起作用,即 为了能够从 设置此属性VM
,您可以使用attached property
. 使用时,EventTrigger
不再需要它。XAML
因此,
VM
您可以向SelectedItems
绑定到我们的 的 中添加元素AttachedProperty
。我认为你是在为自己找麻烦。
看,您的业务逻辑想要从承包商中选择合作伙伴。这是业务逻辑的重要组成部分,这意味着不后悔为它创建一个单独的 VM 类是有道理的:
现在您的任务很简单:当您输入业务逻辑的这一部分时,您创建一个 的列表
MaybePartner
,并简单地绑定为似乎就是一切。
像这样改变它:
事件处理程序代码:
原则上,一切正常,这个解决方案适合我。谁会建议如何使用复选框使其适应视图。