Как создать новые флажки из целевого файла XML - PullRequest
1 голос
/ 16 февраля 2011

если у меня есть новая цель в 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 голосов
/ 16 февраля 2011

Предположим, что 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. ItemsSource для нашего ItemsControl будет набором атрибутов target , выбранных из antcall узлов (объектов XmlAttribute). Затем мы определяем 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>
0 голосов
/ 16 февраля 2011

Хорошо, я могу рассказать вам, как это сделать, но не совсем в коде. Потому что это будет много кода. Я могу показать вам путь, и вот как это происходит:

Самый простой способ сделать это - сначала проанализировать ваш xml. Вы можете использовать linq-to-xml для этого. Пример .

После этого вы можете использовать метод String.Replace, чтобы удалить подчеркивания и добавить пробелы. С чем-то вроде:

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

Это решит, как вы будете загружать XML. Теперь вы можете создать окно и объявить ListView с CheckBox как GridViewColumn, который связан с классом, который содержит имя и логическое значение для представления состояния 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 в загруженном окне событии:

List<MyCheckBoxes> listBoxes = new List<MyCheckBoxes>();
..
// Fill listBoxes with date in constructor or before the below
// mentioned statement in window loaded event...
..
// In window loaded event...
myCheckBoxColumns.ItemsSource = listBoxes; 

Это должно помочь вам, я верю. Не стесняйтесь спрашивать что-либо, если это не понятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...