对我试图自己找到的给定答案不满意......好吧,事实证明它更像是一个黑客而不是一个解决方案,但对我来说效果很好。此解决方案以特殊方式使用 MultiBindings。首先,它可能看起来像大量代码,但您可以毫不费力地重用它。
首先我实现了一个'IMultiValueConverter'
public class SelectedItemsMerger : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
SelectedItemsContainer sic = values[1] as SelectedItemsContainer;
if (sic != null)
sic.SelectedItems = values[0];
return values[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return new[] { value };
}
}
还有一个 SelectedItems 容器/包装器:
public class SelectedItemsContainer
{
/// Nothing special here...
public object SelectedItems { get; set; }
}
现在我们为 ListBox.SelectedItem(单数)创建绑定。注意:您必须为“转换器”创建一个静态资源。这可以在每个应用程序中完成一次,并被所有需要转换器的 ListBox 重用。
<ListBox.SelectedItem>
<MultiBinding Converter="{StaticResource SelectedItemsMerger}">
<Binding Mode="OneWay" RelativeSource="{RelativeSource Self}" Path="SelectedItems"/>
<Binding Path="SelectionContainer"/>
</MultiBinding>
</ListBox.SelectedItem>
在 ViewModel 中,我创建了可以绑定到的 Container。使用 new() 初始化它以便用值填充它是很重要的。
SelectedItemsContainer selectionContainer = new SelectedItemsContainer();
public SelectedItemsContainer SelectionContainer
{
get { return this.selectionContainer; }
set
{
if (this.selectionContainer != value)
{
this.selectionContainer = value;
this.OnPropertyChanged("SelectionContainer");
}
}
}
就是这样。也许有人看到了一些改进?你怎么看待这件事?