从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方法可以做到这一点???任何见解都将不胜感激。

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

从XML生成可编辑表单的方法

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

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