我正在尝试根据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}" />
我希望它可以让某人明白。
答案 0 :(得分:1)
您是否尝试在viewmodel中实施 INotifyPropertyChanged ,然后在设置 SelectedItem 时引发 PropertyChanged 事件?
如果这本身不能修复它,那么当您导航回页面时,您将能够自己手动提升 PropertyChanged 事件,这应该足以让WPF重绘自己并显示正确的选定项目。