如果我在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: 如果我单击当前图形用户界面上的“刷新”按钮,我将能够为我的图形用户界面添加一个复选框。这样可以刷新图形用户界面并显示新的复选框
答案 0 :(得分:0)
好吧,我可以告诉你如何去做,但不完全是代码。因为那会有很多代码。我可以告诉你的方式,这里是如何:
最简单的方法是首先解析你的xml。你可以使用linq-to-xml。 Example
在此之后,您可以使用String.Replace
方法删除下划线并添加空格。有类似的东西:
string formattedCaption = checkBoxCaptionExtractedFromXml.Replace('_', ' ');
这将解决您如何加载xml。现在,您可以创建一个窗口并声明ListView
CheckBox
为GridViewColumn
,绑定到包含名称的类和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>