1

それぞれにリストを含むViewModelのリストがあります。

このリストをビューの ListBox にバインドして、 を設定するSelectedViewModelと、ビューの ListBox に new のエントリが表示されるようになりますSelectedViewModel。これにより、選択も保持されます。

現在の Caliburn Micro の規則でこれを行うことは可能ですか、それとも明示的に述べる必要がありますか?

例えば:

vmList2 つの ViewModel を含むと呼ばれる ViewModel のリストがFruitありVegます。

ViewModelFruitには list が含まれています["Apple", "Pear"]

ViewModelVegには list が含まれています["Carrot", "Cabbage"]

Fruitは現在のSelectedViewModelものなので、私のビューの ListBox は現在表示されているはずです:

Apple
*Pear*

PearListBox で現在選択されているアイテムです。

ここで、ビューの更新を表示するように設定Vegします。SelectedViewModel

*Carrot*
Cabbage

CarrotListBox で現在選択されているアイテムです。ここFruitSelectedViewModel、ビューを更新して次のように表示する必要があります。

Apple
*Pear*

PearListBox で選択された項目はどこにありますか。

4

1 に答える 1

1

これは可能なはずです。最も簡単な機能は、CM 規則を使用してリスト コンテンツをバインドし、リストのSelectedItemバインディングも提供することです。各 VM で最後に選択された項目を追跡する必要があるため、(VM 自体またはメイン VM のいずれかで) それについてもタブを維持する必要があります。

したがって、解決策は次のようになります。

public class ViewModelThatHostsTheListViewModel
{
    // All these properties should have property changed notification, I'm just leaving it out for the example
    public PropertyChangedBase SelectedViewModel { get; set; } 

    public object SelectedItem { get; set; }

    // Dictionary to hold last selected item for each VM - you might actually want to track this in the child VMs but this is just one way to do it
    public Dictionary<PropertyChangedBase, object> _lastSelectedItem = new Dictionary..etc()

    // Keep the dictionary of last selected item up to date when the selected item changes
    public override void NotifyOfPropertyChange(string propertyName)
    {
        if(propertyName == "SelectedItem")
        {
            if(_lastSelectedItem.ContainsKey(SelectedViewModel))
                _lastSelectedItem[SelectedViewModel] = SelectedItem;
            else
                _lastSelectedItem.Add(SelectedViewModel, SelectedItem);
        }
    }
}

次に、XAML で

<ListBox x:Name="SelectedViewModel" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />

明らかに、ここで項目テンプレートを設定して、ビューモデルの共通プロパティにバインドします (インターフェイスをDisplayName使用IHaveDisplayNameして物事を適切に統合するなど)。

編集:

簡単なメモ: VM 自体がListオブジェクトではなく、代わりにリストが含まれている場合は、リスト項目を明示的ににバインドする必要があるかもしれませんが、ListBoxそれはあなた次第ItemTemplateです (CM を取得して、VM ベースの VM とビューを解決し続けることができます)。ContentControlコンベンションバインディング上)

<ListBox ItemsSource="{Binding SelectedViewModel.ListItems}" ...etc />
于 2013-03-21T09:21:54.973 に答える