MVVM加载视图取决于ComboBox选择的项目

时间:2014-12-19 09:51:56

标签: c# mvvm view combobox viewmodel

我正在尝试根据ComboBox选择的项目值动态加载视图。我本周开始使用MVVM,可能我没有看到任何东西。

ComboBox视图位于上方,我希望下方视图必须根据所选项目进行更改。

主视图如下所示:

   <UserControl.Resources>
    <swv:SelectSolidWorkFileTypeView x:Key="Selector" />
    <DataTemplate DataType="{x:Type swv:SelectSolidWorkFileTypeView}"  >
        <swv:SolidWorkAssembliesFilesView />
    </DataTemplate>

    <swv:SolidWorkAssembliesFilesView x:Key="AssemblyFilesView" />
    <DataTemplate DataType="{x:Type swv:SolidWorkAssembliesFilesView}">
        <swv:SolidWorkAssembliesFilesView />
    </DataTemplate>

    <swv:SolidWorksRotorFilesView x:Key="RotorenFilesView" />
    <DataTemplate DataType="{x:Type swv:SolidWorksRotorFilesView}">
        <swv:SolidWorkAssembliesFilesView />
    </DataTemplate>
</UserControl.Resources>

<Grid Background="Black">
    <Grid.RowDefinitions>
        <RowDefinition Height="10"/>
        <RowDefinition Height="230"/>
        <RowDefinition Height="6"/>
        <RowDefinition Height="100*"/>
        <RowDefinition Height="10"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="100*"/>
        <ColumnDefinition Width="10"/>
    </Grid.ColumnDefinitions>

    <ContentControl Content="{StaticResource Selector}" Grid.Column="1" Grid.Row="1" />

    <ContentControl Content="{Binding Content}" Grid.Column="1" Grid.Row="3" />

我从List对象加​​载ComboBox的值

ModelView(我认为是相关的):

// Property to embed views on the main view
    object _content;
    public object Content
    {
        get { return _content; }
        set
        {
            _content = value;
            RaisePropertyChanged("Content");
        }
    }

    List<string> _source = new List<string> { "Assemblies", "Rotoren" };
    string _selectedItem = null;

    //property to return items to the view
    public List<string> Source { get { return _source; } }

    //property to hold the selected item
    public string SelectedItem 
    { 
        get 
        { 
            return _selectedItem;
        } 
        set 
        { 
            _selectedItem = value; RaisePropertyChanged("SelectedItem"); 
        } 
    }

我一直在研究如何制作这样的例子,但我没有运气,顺便说一下,我想用ContentControl制作它,如图所示。如果有人能给我一些提醒,我会非常感激:)

约翰

编辑和示例:

好吧,正如Charan指出的那样,我只需要很好地使用PropertyChanged。

当我使用MVVM Light Toolkit时,我使用RisePropertyChanged。我做的是......

设置属性。

这里我为ComboBox创建了一个事件,因为它取决于哪个View必须显示并设置CurrentView属性:

    // cbType is a ComboBox, here is the property to it
    private string _cbType;
    public string cbType
    {
        get { return _cbType; }
        set
        {
            _cbType = value;
            if (_cbType == "Assemblies")
                //if the Type is Assemblies, it will call the proper view for it
                CurrentViewModel = new SolidWorkAssembliesFilesView();
            if (_cbType == "Rotoren")
                //if the Type is Rotoren, it will call the proper view for it
                CurrentViewModel = new SolidWorksRotorFilesView();

            RaisePropertyChanged("cbType");
        }
    }

CurrentViewModel也是我创建的一个属性,因为它已经改变,事件将被触发并且视图将被更改。

    //Nothing special here
    private object currentViewModel;
    public object CurrentViewModel
    {
        get { return currentViewModel; }
        set
        {
            currentViewModel = value;
            RaisePropertyChanged("CurrentViewModel");
        }
    }

最后,您只需要正确绑定Property,在本例中为View中的ComboBox:

<ComboBox Grid.Column="1" Text="{Binding Path=cbType, Mode=TwoWay}" ItemsSource="{Binding Path=Source}" />

我希望它可以让某人明白。

1 个答案:

答案 0 :(得分:1)

您是否尝试在viewmodel中实施 INotifyPropertyChanged ,然后在设置 SelectedItem 时引发 PropertyChanged 事件?

如果这本身不能修复它,那么当您导航回页面时,您将能够自己手动提升 PropertyChanged 事件,这应该足以让WPF重绘自己并显示正确的选定项目。