1

我得到了一个包含五个条目和五个用户控件的组合框。

当我选择 ComboBox 条目时,我想将第一个 UserControl 分配给我的网格。在第二个 ComboBox 条目上、第二个 UserControl 上、在第三个条目上......等等。

现在每个 UserControl 都包含一堆控件,例如 TextControls、ComboBoxes 和 CheckBoxes。

让我们想象下面的伪代码:

combobox_SelectedIndexChanged()
{
    if(comboBox.SelectedIndex == 1)
       grid.Content = new UserControlOne();
    else if(comboBox.SelectedIndex == 2)
       grid.Content = new UserControlTwo();
    else if(comboBox.SelectedIndex == 3)
       grid.Content = new UserControlThree();
    [...]
}

在单击按钮时,我想获取分配控件的值,但我不知道如何访问 UserControl。

buttonSave_click()
{
    //TODO: Get Values of a UserControl and assign it to the Model-Class    
}

如何访问 UserControl 的控件并获取它们的值?

4

2 回答 2

3

就个人而言,我会使用 MVVM 设计模式做这样的事情

ComboBox绑定到ViewModelModel对象的集合

所以你会有

<ComboBox ItemsSource="{Binding SomeCollection}" 
          SelectedItem="{Binding SelectedViewModel}"
          DisplayMemberPath="DisplayName" />

whereSomeCollectionobject您的ViewModel, 的集合,SelectedViewModelobject保存所选项目的属性

SomeCollection = new ObservableCollection<object>();
SomeCollection.Add(new ViewModelA());
SomeCollection.Add(new ViewModelB());
SomeCollection.Add(new ViewModelC());
SomeCollection.Add(new ViewModelD());
SomeCollection.Add(new ViewModelE());

SelectedViewModel = SomeCollection[0];

现在您SaveCommand可以访问通过使用选择的任何内容SelectedViewModel并将其转换为基于typeof(SelectedViewModel)的适当类型

就个人而言,我会使用通用接口IViewModel而不是object,并让它包含一些通用属性(例如DisplayName)和方法。根据您的功能,您甚至可以让它包含它自己的保存逻辑,因此您可以在保存命令中执行它:

SelectedViewModel.Save();

至于显示正确的 View/UserControl,我会使用ContentControl,Content绑定到你的SelectedViewModel, 并使用隐式数据模板告诉 WPF 如何绘制每个对象

<ContentControl Content="{Binding SelectedViewModel}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type local:ViewModelA}">
            <local:UserControlA />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:ViewModelB}">
            <local:UserControlB />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:ViewModelC}">
            <local:UserControlC />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:ViewModelD}">
            <local:UserControlD />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:ViewModelE}">
            <local:UserControlE />
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>
于 2012-06-08T16:21:24.080 回答
1

将依赖属性添加到的类,并将它们绑定到您希望向世界公开UserControl的控件的属性。UserControl这使您UserControl可以向外界呈现一个合适的界面,同时在其内部环境的安全范围内做任何需要做的事情。

于 2012-06-08T16:02:39.070 回答