在WPF(MVVM)中动态更改窗口的用户控件

时间:2016-05-11 12:26:50

标签: wpf xaml checkbox mvvm user-controls

我正在研究wpf mvvm模式。 我有一个用户控件,我在其中加载DataGridCheckBoxColumn中的复选框列表,并将其从我的viewmodel绑定到IsSelected属性。

Tha xaml代码是这样的:

<DataGrid Width="150" Grid.Row="0" Background="LightGray" CanUserAddRows="False"  AutoGenerateColumns="False" HorizontalAlignment="Left" Name="dataGridCustomers" ItemsSource="{Binding Path=UsecaseListItems}" CanUserResizeColumns="False" CanUserResizeRows="False">
            <DataGrid.Columns>


                    <DataGridCheckBoxColumn Binding="{Binding Path=IsSelected,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay,IsAsync=True}"  Width="50">

                        <DataGridCheckBoxColumn.HeaderTemplate>
                            <DataTemplate x:Name="dtAllChkBx">
                            <CheckBox Name="cbxAll" FontWeight="Bold" Content="All" IsChecked="{Binding Path=DataContext.AllSelected,RelativeSource={RelativeSource AncestorType=UserControl },Mode=TwoWay}"/>
                            </DataTemplate>
                        </DataGridCheckBoxColumn.HeaderTemplate>
                    </DataGridCheckBoxColumn>

                <DataGridTextColumn Width="85" Binding="{Binding Path=UsecaseName}" Header="UsecaseName"  IsReadOnly="True" >
                    <DataGridColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="FontWeight" Value="Bold"/>
                            <Setter Property="Foreground" Value="Black"></Setter>
                        </Style>
                    </DataGridColumn.HeaderStyle>
                </DataGridTextColumn>



            </DataGrid.Columns>
          </DataGrid>

我的HomeViewModel是这样的:

private bool _IsSelected;
        public bool IsSelected
        {
            get { return _IsSelected; }
            set
            {
                _IsSelected = value;
                OnPropertyChanged("IsSelected");
            }
        }

        private Control _someUserControl;
        public Control CCS01
        {
            get { return _someUserControl; }
            set { _someUserControl = value; }
        }

        private UserControl _content;

        internal void SetNewContent(UserControl _content)
        {
            ContentWindow = _content;
        }

        public UserControl ContentWindow
        {
            get { return _content; }
            set
            {
                _content = value;
                OnPropertyChanged("ContentWindow");
            }
        }

对于我的第一个复选框(CCS01),我创建了一个视图(CCS01.xaml),其中包含一些网格格式的标签和文本框。其对应的ViewModel如下:

public class CCS01ViewModel: BaseNotifyPropertyChanged
    {
        HomeViewModel _homeViewModel;
        public ICommand OpenUsersCommand { get; private set; }


        public CCS01ViewModel(HomeViewModel mainModel)
        {
            this._homeViewModel = mainModel;
            //this._model = model;
            OpenUsersCommand = new RelayCommand(OpenUsers, CanOpenUsers);
        }

        private void OpenUsers(object _param)
        {
            //UsersPanelViewModel upmodel = new UsersPanelViewModel(_mainModel, _model);
            //UsersPanel up = new UsersPanel();
            //up.DataContext = upmodel;
            //_mainModel.SetNewContent(up);
        }

        private bool CanOpenUsers(object _param)
        {
            return true;
        }

}

我想在主UserControl(ExecutionDetails.xaml)中加载选定的复选框视图。目前,我默认加载它的第一个Checkbox视图,如下所示:

<StackPanel>
     <Grid Name="HostGrid">
            <ContentControl Content="{Binding ContentWindow}"/>
     </Grid>
</StackPanel> 

请建议我如何根据复选框选择动态地将视图与用户控件的相应复选框绑定。

这个(ExecutionDetails.xaml.cs)背后的代码是这样的:

public partial class ExecutionDetails : UserControl
    {
        public ExecutionDetails()
        {
            InitializeComponent();

            HomeViewModel viewmodel = new HomeViewModel();
            CCS01ViewModel ccViewModel = new CCS01ViewModel(viewmodel);

            CCS01 obj = new CCS01();
            obj.DataContext = ccViewModel;
            viewmodel.ContentWindow = obj;
            this.DataContext = viewmodel;
        }
    }

0 个答案:

没有答案