正确处理 WPF 用户控件上的控件

本文关键字:控件 用户 WPF 正确处理 | 更新日期: 2023-09-27 18:36:46

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

当我选择 ComboBox 条目时,我想将第一个用户控件分配给我的网格。在第二个组合框条目上,第二个用户控件,在第三个条目上...等等。

现在,每个用户控件都包含一堆控件,例如文本控件,组合框和复选框。

让我们想象以下伪代码:

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

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

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

如何访问用户控件的控件并获取其值?

正确处理 WPF 用户控件上的控件

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

ComboBox将绑定到ViewModelModel对象的集合

所以你会有

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

其中SomeCollectionViewModel上的object集合,SelectedViewModel是用于保存所选项目的object属性

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)和方法。根据您的功能,您甚至可以让它包含自己的保存逻辑,因此您可以在 save 命令中执行此操作:

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>

将依赖属性添加到UserControl的类中,并将它们绑定到UserControl内您希望向世界公开的控件的属性。这使您的UserControl能够向外界提供合适的界面,同时在其内部环境的安全环境中做任何需要做的事情。