正确处理 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
}
如何访问用户控件的控件并获取其值?
就个人而言,我会使用 MVVM 设计模式做这样的事情
ComboBox
将绑定到ViewModel
或Model
对象的集合
所以你会有
<ComboBox ItemsSource="{Binding SomeCollection}"
SelectedItem="{Binding SelectedViewModel}"
DisplayMemberPath="DisplayName" />
其中SomeCollection
是ViewModel
上的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
能够向外界提供合适的界面,同时在其内部环境的安全环境中做任何需要做的事情。