WPF中按钮选择中的问题

时间:2018-04-03 14:26:14

标签: wpf xaml

我是WPF MVVM的新手。我有MainWindow.xaml这里Grid分为两列。 Column1与MenuUserControl.xaml挂钩,它有两个名为Page1和Page2的按钮。 Column2与ContentControl挂钩,用于根据MenuUserControl.xaml中的按钮单击显示视图。单击Page1按钮时,其背景颜色应更改为蓝色,然后单击Page2按钮时,其背景颜色应更改为蓝色,Page1背景颜色应更改为正常。如何在XAML中实现这一目标?

1 个答案:

答案 0 :(得分:0)

假设浅蓝色是可以接受的,那么这是一个解决方案。

MainWindow有一个用于选择视图的列表框和一个用于显示页面的框架。我通常会使用contentcontrol和usercontrols而不是框架和页面,但是......

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>
<Window.Resources>
    <DataTemplate DataType="{x:Type local:Page1ViewModel}">
        <local:Page1/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:Page2ViewModel}">
        <local:Page2/>
    </DataTemplate>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="120"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <ListBox Name="ViewSelect"
             ItemsSource="{Binding ViewChoices}"
             SelectedItem="{Binding SelectedViewChoice, Mode=TwoWay}"
             >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Frame Grid.Column="1"
           Content="{Binding SelectedViewChoice.VM}"
           NavigationUIVisibility="Hidden"
           />
</Grid>

ViewChoices是ViewChoice的集合,您选择的任何一个都将是SelectedViewChoice。 VM属性是视图模型的一个实例,它最终由帧呈现。将其模板化到相关视图中。

MainWindowViewModel:

public class MainWindowViewModel : INotifyPropertyChanged
{
    public ObservableCollection<ViewChoice> ViewChoices { get; set; }
    = new ObservableCollection<ViewChoice>
    {
        new ViewChoice{ Name="Page One", VM=new Page1ViewModel()},
         new ViewChoice{ Name="Page Two", VM=new Page2ViewModel()},
    };

    private ViewChoice selectedViewChoice;

    public ViewChoice SelectedViewChoice
    {
        get { return selectedViewChoice; }
        set { selectedViewChoice = value; RaisePropertyChanged(); }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

ViewChoice:

public class ViewChoice
{
    public string Name { get; set; }
    public object VM { get; set; }
}