私が自分で見つけようとしていた与えられた答えに満足していません...まあ、それは解決策というよりはハックのようなものであることがわかりましたが、私にとってはうまくいきます。このソリューションは、特別な方法でマルチバインディングを使用します。最初は大量のコードのように見えるかもしれませんが、ごくわずかな労力で再利用できます。
最初に「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(Singular)のバインディングを作成します。注:「コンバーター」の静的リソースを作成する必要があります。これは、アプリケーションごとに1回実行し、コンバーターを必要とするすべてのリストボックスで再利用できます。
<ListBox.SelectedItem>
<MultiBinding Converter="{StaticResource SelectedItemsMerger}">
<Binding Mode="OneWay" RelativeSource="{RelativeSource Self}" Path="SelectedItems"/>
<Binding Path="SelectionContainer"/>
</MultiBinding>
</ListBox.SelectedItem>
ViewModelで、バインドできるコンテナを作成しました。値を入力するには、new()で初期化することが重要です。
SelectedItemsContainer selectionContainer = new SelectedItemsContainer();
public SelectedItemsContainer SelectionContainer
{
get { return this.selectionContainer; }
set
{
if (this.selectionContainer != value)
{
this.selectionContainer = value;
this.OnPropertyChanged("SelectionContainer");
}
}
}
以上です。多分誰かがいくつかの改善を見ていますか?あなたはそれについてどう思いますか?