silverlight - 带有每个 Tab 的 UI Tabbed 具有不同的 View/ViewModel

标签 silverlight mvvm telerik mvvm-light

在我的项目中,我必须创建一个带有菜单的管理界面。每次单击此菜单时,都会打开一个新选项卡。
因为我在 MVVM 中,所以每个选项卡都是不同的 ViewModel(继承自同一个 ViewModel 基类)和不同的 View。

我已经定义了 ItemTemplate对于标题,但对于所有选项卡都是常见的,而不是内容不是。

我的 TabControl绑定(bind)到 ObservableCollection ViewModel 基类。

那么,如何根据 ViewModel 在界面中加载正确的 View 呢?

最佳答案

Here是我对类似问题的回答,您可以在其中找到扩展的 TabControl 和代码示例。

所以现在我专注于您的特定实现。
在此示例中,TabControl绑定(bind)到 Items属性,一个菜单列表 - 到 MenuItems属性(property)。

public class MainViewModel
{
    public MainViewModel()
    {
        MenuItems = new ObservableCollection<string>(){ "Item 1", "Item 2", "Item 3"};
        this.Items = new ObservableCollection<TabItemViewModel>
                         {
                             new TabItemViewModel("Tab 1", OnItemRequestClose),
                             new TabItemViewModel("Tab item 2", OnItemRequestClose)
                         };
    }

    public ObservableCollection<string> MenuItems { get; set; }

    public string CurrentMenuItem
    {
        get { return currentMenuItem; }
        set 
        { 
            currentMenuItem = value; 
            OnPropertyChanged("CurrentMenuItem");
            this.OnMenuChanged();
        }
    }

    public ObservableCollection<TabItemViewModel> Items { get; set; }

    public void OnItemRequestClose(TabItemViewModel item)
    {
        this.Items.Remove(item);
    }
}

XAML:
<ListBox ItemsSource="{Binding MenuItems}" 
         SelectedItem="{Binding CurrentMenuItem, Mode=TwoWay}" />

您可以使用绑定(bind)到 SelectionChanged 的命令。事件,但我的解决方案更通用。

方法 OnMenuChanged 的实现:
private void OnMenuChanged()
{
    if(this.CurrentMenuItem == "Item 1")
    {
        var addItem = new TabItemViewModel("Item 1", OnItemRequestClose);
        addItem.Content = new SomeView() { DataContext = new SomeViewModel() };
        this.Items.Add(addItem);
    }
    //and so on, and so forth
}

我在实际应用程序中使用了这个解决方案,因此您可以确定它可以正常工作。

关于silverlight - 带有每个 Tab 的 UI Tabbed 具有不同的 View/ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5064356/

相关文章:

Silverlight 问题 : Save in Jpeg format

javascript - 使用 Kendo Grid 如何删除列边框?

wpf - 有没有办法检查什么 Style 正在为控件设置属性值?

javascript - Telerik 的 RadSpell 的 StartSpellCheck 错误

wpf - 在 wpf 的 Combobox 中关闭自动完成

c# - Silverlight Datagrid : Changing cell styles, 基于值

jquery - PC 上的 Google Chrome 在 document.createEvent ("TouchEvent"处成功)...?

silverlight - 对象列表框和按钮

c# - WPF MVVM 加载时的焦点字段

c# - 按Enter时将Focus设置为DataGridTemplateColumn子控件