我需要创建一个将包含
的.ini文件的应用程序元素的值允许用户编辑这些值并保存新的.ini文件。由于.ini文件不能包含指定组中的不同元素,因此需要动态生成GUI。 从我读到的关于WPF的内容来看,它主要依赖于数据绑定和通知属性更改。
由于我的视图模型需要容纳不同数量的变量,我无法绑定到属性,我计划将一个事件处理程序附加到所有文本框,当TextBox丢失时,它将选择相应的验证规则按下焦点或输入。之后,如果模型通过验证,则应相应地更新模型,并使用相应值的模型更新View。
我想知道这听起来是否是一个有效的想法,我是否应该阅读类似的设计模式,或者我是否应该完全避开WPF?
答案 0 :(得分:2)
您仍然可以使用绑定 - 因为WPF支持项目模板化,并且由于您使用的是MVVM模式,因此您只需为列表中的每个子项创建一个VM(您甚至不需要 为此,您可以直接在每个列表项的模板中绑定到DTO或业务对象)
我现在正在做类似的事情 - 我有一个客户的材料测试列表,他们想要为每种材料提供可变数量和类型的测试,但也能够调整和更改这些测试为他们的客户订购
他们实际上有两种测试类型,但为了描述两种情况中的更简单(不需要子虚拟机),我刚刚创建了一个具有项模板的ItemsControl
:
<ItemsControl ItemsSource="{SomeBinding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{PropertyDescription}" />
<TextBox Text="{PropertyValue}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
在这种情况下,模型只包含属性名称/值的列表,并将其显示在堆栈面板中(您可能需要使用ItemPanel
设置ItemsPanelTemplate
。显然,您可以使用扩展{ {1}}允许ItemsControl
为每种类型显示不同的数据模板(实际上WPF已经支持每种类型的数据模板)。
我目前正在使用Caliburn.Micro,它实际上为你设置了很多子模板 - 所以如果你创建绑定项目作为VM,你可以做一些简单的事情:
DataTemplateSelector
只要<ItemsControl x:Name="SomeBinding" />
属性中的子项是VM本身(尽管那是另一个故事:P),CM会处理剩下的事情。
答案 1 :(得分:1)
使用实现this library的类包装INotifyPropertyChanged,以便WPF可以在属性更改后自行更新。这样你就可以有效地数据绑定到INI文件。