WPF导航,用于带有通用模型的向导风格的USERCONTROL



这就是我拥有的

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();
    }
}

最新更新