从XML

时间:2015-06-27 17:18:34

标签: c# xml wpf

<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方法来做这个???任何见解将不胜感激。

即将出现的问题是需要验证输入的数据并处理信息。

2 个答案:

答案 0 :(得分:1)

MVVM方法:从XML文件中提取数据,并将其作为ViewModel类。 ViewModel中的每个属性都对应于XML文件中的数据项。然后使用自定义DataTemplate将ViewModel的内容呈现到屏幕。

我们可以扩展它以呈现项目的列表。列表中的每个项目都是ViewModel。 DataTemplate总是根据附加到的属性的类型进行渲染。因此,您可以拥有一个对象列表,并为列表中的每个项目提供自定义DataTemplate。当然,列表中的所有项目都必须从相同类型继承。

这意味着您可以拥有一个项目列表,每个项目可以根据XML文件中的数据类型进行不同的呈现。这意味着列表中的每个项目都可以具有不同的小数位数,颜色等自定义外观。

之前我使用过这种技术,效果很好。

<强>更新

例如,请参阅:

答案 1 :(得分:0)

如果我正在解决这个问题,我会考虑动态生成C#。我将如何做到这一点:

  • 所有XAML都编译为一系列C#命令。
  • 我会将XAML设置为按照我喜欢的方式格式化。
  • 我会找到等效的C#代码。
  • 然后我会插入适当的if / else语句来改变C#以适应。

我会尝试另一种方法:

  • 可以将自定义XAML渲染到屏幕上的某个区域。
  • 我会根据XML编辑XAML,然后在屏幕上显示这个自定义XAML。

我很想知道这些方法中的任何一种是否在实践中有效,或者是否有更好的方法可行。