如何从xml文件目标创建新的复选框

时间:2011-02-16 07:23:23

标签: c# wpf xml

如果我在xml文件中有新目标,如

<target name="main" depends="init">
 <antcall target="Exec_Install_abc" /></target>

其中“Install abc”是新目标。如果我想加载这个xml文件,如果我在我的xml文件中检测到任何新目标,我会想要使用以下代码永久地向图形用户界面添加一个新复选框:

ExecinstallabcCheckBox.Content = "Exec Install Abc";

听起来我需要做xml解析。但我不确定这是否是正确的做法。这意味着我将最终编辑我的xaml和xaml.cs文件。我还需要删除“下划线”,并根据需要在单词之间放置空格。我对从哪里开始以及如何去做有点困惑。如果有人能指导我开始我,我将不胜感激。谢谢。

EDIT1: 如果我单击当前图形用户界面上的“刷新”按钮,我将能够为我的图形用户界面添加一个复选框。这样可以刷新图形用户界面并显示新的复选框

2 个答案:

答案 0 :(得分:0)

好吧,我可以告诉你如何去做,但不完全是代码。因为那会有很多代码。我可以告诉你的方式,这里是如何:

最简单的方法是首先解析你的xml。你可以使用linq-to-xml。 Example

在此之后,您可以使用String.Replace方法删除下划线并添加空格。有类似的东西:

string formattedCaption = checkBoxCaptionExtractedFromXml.Replace('_', ' ');

这将解决您如何加载xml。现在,您可以创建一个窗口并声明ListView CheckBoxGridViewColumn,绑定到包含名称的类和bool以表示{{1}的状态}。像这样:

CheckBox

您必须使用要显示的复选框标题填写此类。你可以像这样宣布你的public class MyCheckBoxes { public bool State { get; set; } public string Caption { get; set; } }

ListView

然后在窗口加载的事件中分配<ListView x:Name="myCheckBoxColumns" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding}"> <ListView.View> <GridView> <GridViewColumn Width="250" Header="Some Header"> <GridViewColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding State}" Content="{Binding Caption}" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView> 的填充列表:

MyCheckBoxes

我相信这应该适合你。如果不可理解,请随时提出任何问题。

答案 1 :(得分:0)

假设xml存储在“c:\ test.xml”位置并且包含内容:

<?xml version="1.0" standalone="yes"?>
<target name="main" depends="init">
 <antcall target="Exec_Install_abc" />
</target>

因此,您应该将XmlDataProvider作为静态资源放入xaml:

<Window.Resources>
    <XmlDataProvider Source="c:\\test.xml" x:Key="xDoc"/>
    <self:UnderscoresConverter x:Key="UnderscoresConverter"/>
</Window.Resources>

然后在复选框中使用Binding for Content属性:

<CheckBox Content="{Binding Source={StaticResource xDoc}, XPath=target/antcall/@target, Path=Value, Converter={StaticResource UnderscoresConverter}}"/>

不要忘记转换器替换下划线(也将其放入资源,如上所述):

public class UnderscoresConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.ToString().Replace('_', ' ');
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

<强> EDITED

考虑更复杂的情况。我们的xml文档如下所示:

<?xml version="1.0" standalone="yes"?>
<targets>
    <target name="main" depends="init">
        <antcall target="Exec_Install_abc" />
    </target>
    <target name="main" depends="init">
        <antcall target="Ololo_jesus_christ" />
    </target>
    <target name="main" depends="init">
        <antcall target="One_____more target" />
    </target>
</targets>

现在我们有很多目标,必须创建很多复选框。好的,我们需要ItemsControl。 ItemsControl的ItemsSource将是从 antcall 节点(XmlAttribute对象)中选择的属性 target 的集合。然后我们定义一个DataTemplate,将CheckBox放在其中,并通过转换器将Content属性绑定到Value属性,删除下划线符号。

尽管有明显的复杂性,但结果代码相当简单:

<ItemsControl ItemsSource="{Binding Source={StaticResource xDoc}, XPath=targets/target/antcall/@target}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Path=Value, Converter={StaticResource UnderscoresConverter}}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>