<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将生成一个显示值的表单,其中包含适当的控件和值格式。但我无法将这些东西转回来。 我没有看到符合Binding要求的简单更改。也许解决这个问题需要改变架构。我怎么能这样做?
魔术从这里开始。将此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 event doesn't fire for XML element,并了解到Path =不可能。被用作&#39;。&#39;是一个对象,但不是依赖属性。
那么,我需要一种为DependencyProperty
提供Binding
的方法。因此ComboView
需要接收一个具有属性的对象,该属性是我想要的XmlElement
。我认为这意味着我真的需要改变一些事情但是没有丝毫想法。也许有一个MVVM方法来做这个???任何见解将不胜感激。
即将出现的问题是需要验证输入的数据并处理信息。
答案 0 :(得分:1)
MVVM方法:从XML文件中提取数据,并将其作为ViewModel类。 ViewModel中的每个属性都对应于XML文件中的数据项。然后使用自定义DataTemplate
将ViewModel的内容呈现到屏幕。
我们可以扩展它以呈现项目的列表。列表中的每个项目都是ViewModel。 DataTemplate
总是根据附加到的属性的类型进行渲染。因此,您可以拥有一个对象列表,并为列表中的每个项目提供自定义DataTemplate
。当然,列表中的所有项目都必须从相同类型继承。
这意味着您可以拥有一个项目列表,每个项目可以根据XML文件中的数据类型进行不同的呈现。这意味着列表中的每个项目都可以具有不同的小数位数,颜色等自定义外观。
之前我使用过这种技术,效果很好。
<强>更新强>
例如,请参阅:
答案 1 :(得分:0)
如果我正在解决这个问题,我会考虑动态生成C#。我将如何做到这一点:
我会尝试另一种方法:
我很想知道这些方法中的任何一种是否在实践中有效,或者是否有更好的方法可行。