1

我有一个 ViewModel 列表,每个 ViewModel 都包含一个列表。

我想将此列表绑定到视图中的 ListBox,以便我可以设置 aSelectedViewModel并且视图中的 ListBox 现在显示新的SelectedViewModel. 这也应该保留选择。

是否可以使用当前的 Caliburn Micro 约定来做到这一点,还是我必须明确说明这一点?

例如:

我有一个名为 ViewModel 的列表,vmList其中包含两个 ViewModel,Fruit并且Veg.

ViewModelFruit包含列表["Apple", "Pear"]

ViewModelVeg包含列表["Carrot", "Cabbage"]

Fruit是当前的SelectedViewModel,所以我的视图的 ListBox 当前应该显示:

Apple
*Pear*

Pear当前是 ListBox 中的选定项。

现在我设置VegSelectedViewModel我的视图更新以显示:

*Carrot*
Cabbage

Carrot当前是 ListBox 中的选定项。现在,如果我Fruit重新设置为SelectedViewModel我的视图应该更新以显示:

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界面来保持良好和集成)

编辑:

快速说明:如果您的虚拟机本身不是List对象而是包含一个列表,那么您可能必须将列表项显式ListBox绑定ItemTemplate到关于ContentControl约定绑定)

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