从XML生成可编辑表单的方法
本文关键字:表单 方法 编辑 XML | 更新日期: 2023-09-27 18:00:09
<press_limits value="1055" label="Press Limits" type="single 317" format="object">
<projected_area value="0.052944637336319995" label="Projected area of part" type="real(m*m)"/>
<press_tonnage value="500.0" label="Press tonnage" type="real(g)" units="0Ton"/>
<within_press_limit value="1" label="within limits of press" type="boolean"/>
根据与上面类似的XML,下面的XAML将生成一个显示值的表单,其中包含适当的控件和值格式。但我无法将这些东西转换回来我看不到能满足绑定要求的简单更改。也许修复此问题需要架构更改。我该如何以不同的方式做到这一点
魔法从这里开始。将此ItemsControl绑定到XmlElement,它将为每个子元素构建一个ControlChooser。
<ItemsControl ItemsSource="{Binding XPath=*}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate><WrapPanel/></ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<W3V:ControlChooser Content="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
ControlChooser
触发格式属性:
<Style.Triggers>
<DataTrigger Binding="{Binding XPath=@format}" Value="spin">
<Setter Property="ContentTemplate" Value="{StaticResource combo}" />
</DataTrigger>
选择DataTemplate
:
<DataTemplate x:Key="combo" > <W3V:ComboView /> </DataTemplate>
它提供以下控制:
<ComboBox Style="{StaticResource ComboButtonStyle}" Width="200"
Text="{Binding Path=., ## PROBLEM, BUT HOW TO AVOID?
Converter={StaticResource valueFormattingConverter },
IsEditable="True" />
valueFormattingConverter
使用@units、@type和@value属性来生成格式正确的文本。问题是,这不会转换回来。我在这里问:TextBox ConvertBack事件没有';t激发XML元素,并了解到Path=是不可能的。用作"."是对象,但不是依赖属性。
因此,我需要一种为Binding
提供DependencyProperty
的方法。所以ComboView
需要接收一个具有属性的对象,该属性是或具有我想要的XmlElement
。我想这意味着我真的需要改变,但我一点也不知道该怎么做。也许有一种MVVM方法可以做到这一点???任何见解都将不胜感激。
即将出现的问题是需要验证键入的数据并处理信息。
MVVM方法:从XML文件中提取数据,并将其放入ViewModel类中。ViewModel中的每个属性都对应于XML文件中的一个数据项。然后使用自定义DataTemplate
将ViewModel的内容呈现到屏幕上。
我们可以将其扩展为呈现项目列表。列表中的每个项目都是一个ViewModel。DataTemplate
总是根据它所附加的属性的类型进行渲染。因此,您可以有一个对象列表,并为列表中的每个项自定义DataTemplate
。当然,列表中的所有项都必须从同一类型继承。
这意味着您可以有一个项目列表,并且每个项目可以根据XML文件中的数据类型进行不同的呈现。这意味着列表中的每个项目都可以有不同小数位数、颜色等的自定义外观。
我以前用过这种技术,效果很好。
更新
例如,请参阅:
- http://www.wpftutorial.net/datatemplates.html
- http://www.stackoverflow.com/questions/3400532/display-multiple-types-from-a-single-list-in-a-wpf-listbox.
如果我要解决这个问题,我会考虑动态生成C#。以下是我的做法:
- 所有XAML都编译成一系列C#命令
- 我会将XAML设置为我喜欢的格式
- 我会找到等价的C#代码
- 然后,我会插入适当的if/else语句来更改C#以适应
我会尝试的另一种方法:
- 可以将自定义XAML呈现到屏幕上的某个区域中
- 我会根据XML编辑XAML,然后在屏幕上显示这个自定义XAML
我很想知道这两种方法在实践中是否有效,或者是否有更好的方法可行。