这就是我拥有的
public class Model : INotifyPropertyChanged
{
private int propertyA;
public int PropertyA
{
get{ return propertyA; }
set{ propertyA = value; NotifyPropertyChanged("PropertyA");
}
}
然后,我有一个" mainwindow",该按钮在侧面有一组按钮,以及一个"主内容"区域,可以更改我使用的用户控件
<Window>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"></ColumnDefinition>
<ColumnDefinition Width="300*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<StackPanel>
<Button x:Name="btnFirstStep" Content="firstStep" ></Button>
<Button x:Name="btnSecondStep" Content="secondStep" ></Button>
</StackPanel>
<Grid Grid.Column="1" x:Name="mainContent"></Grid>
</Grid>
public partial class MainWindow : Window
{
private Model model;
private UserControl firstStep;
private UserControl secondStep;
public MainWindow()
{
model = new Model();
model.PropertyChanged += PropertyChanged;
InitializeComponent();
firstStep = new UserControl(model);
secondStep = new UserControl(model);
}
public void PropertyChanged(object sender, EventArgs e)
{
switch(e.PropertyName)
{
case "PropertyA": mainContent.content = secondStep; break;
}
}
我的问题是,我应该怎么做?目的是能够将数据绑定到UserControls,全部来自共同模型,并在不同的用户控件之间导航,因此最终结果是"向导"样式应用程序。
可以使用PropertyChanged
事件更改导航,还是我应该使用实际事件?
这是您的MVVM示例。基本上您应该:
- 在视图模型中定义命令,该命令将属性设置为代表当前步骤的类型。
- 在视图中每个步骤定义
DataTemplate
。例如,您可以为每个步骤定义UserControl
。 - 将导航按钮绑定到命令
查看模型:
public class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel ()
{
NavigateCommand = new RelayCommand<string>(GoToStep);
}
public ICommand NavigateCommand { get; private set; }
private IStep _currentStep;
public IStep CurrentStep
{
get { return _currentStep; }
set { _currentStep = value; NotifyPropertyChanged(); }
}
private void GoToStep(string s)
{
switch(s)
{
case "firstStep":
CurrentStep = new FirstStep();
break;
case "secondStep":
CurrentStep = new SecondStep();
break;
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
模型:
public interface IStep { }
public class FirstStep : IStep { }
public class SecondStep : IStep { }
查看:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"></ColumnDefinition>
<ColumnDefinition Width="300*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<StackPanel>
<Button x:Name="btnFirstStep" Command="{Binding NavigateCommand}" CommandParameter="firstStep" Content="firstStep"/>
<Button x:Name="btnSecondStep" Command="{Binding NavigateCommand}" CommandParameter="secondStep" Content="secondStep"/>
</StackPanel>
<ContentControl Content="{Binding CurrentStep}" Grid.Column="1">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:FirstStep}">
<TextBlock>first...</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type local:SecondStep}">
<TextBlock>second...</TextBlock>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</Grid>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
}
}