WPF: отображение атрибута XML в качестве флажка - PullRequest
2 голосов
/ 17 декабря 2009

У меня есть этот XmlElement, и я добавляю в него некоторые атрибуты:

xmlElemMux.SetAttribute("test1", "1");
xmlElemMux.SetAttribute("test2", "0");

Я могу отобразить их в окне, используя текстовое поле, подобное этому, в xaml, после задания для DataContext моей сетки значения xmlElemMux:
TextBox Text="{Binding XPath=@test1}"
TextBox Text="{Binding XPath=@test2}"

Это работает нормально, но я бы хотел использовать флажки вместо текстовых. Я попробовал это:

CheckBox IsChecked="{Binding XPath=@test1}"
CheckBox IsChecked="{Binding XPath=@test2}"

Но оба флажка отображаются как пустые, и привязка не работает.

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 19 декабря 2009

Я не знаю, связано ли это с вашей проблемой, но в настоящее время есть ошибка со стандартным флажком в WPF - когда вы связываетесь со значением IsChecked, оно срабатывает только тогда, когда флажок установлен, а не когда он не отмечен независимо от двусторонней привязки и т. д., что может привести к неожиданным результатам. Я верю, что это будет исправлено в .Net v4, но это стоило мне кучу времени, чтобы почесать голову.

Во всяком случае, я взял пример Бена и просто немного расширил его, и, похоже, он отлично работает с XElement. см. ниже ...

Я сделал конвертер класса

public class IntToBoolConverter : IValueConverter
{    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)    
    {
        int intValue = System.Convert.ToInt32(value);
        return (intValue != 0);  //returns true for any non-zero value                         
    }    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)    
    {
        if ((bool) value == true)
            return "1";
        else
            return "0";

    }
}

Затем в XAML-месте окна с соответствующими ссылками на пространство имен

<Window.Resources>
    <local:IntToBoolConverter x:Key="CheckBoxConv"  />
</Window.Resources>
<Grid Name="myGrid">
    <StackPanel>
        <TextBox Text="{Binding XPath=@test1}" Height="30" Width="200"/>
        <TextBox Text="{Binding XPath=@test2}" Height="30" Width="200"/>
        <CheckBox IsChecked="{Binding XPath=@test2, Converter={StaticResource CheckBoxConv}}"/>
    </StackPanel>
</Grid>

А затем, чтобы проверить это, поместите следующее в коде окна позади.

    public partial class Window1 : Window
{
    private XmlDocument xmlDoc;
    private XmlElement xmlElemMux;

    public Window1()
    {
        InitializeComponent();
        xmlDoc = new XmlDocument();
        xmlElemMux = xmlDoc.CreateElement("Hello");
        xmlElemMux.SetAttribute("test1", "1");
        xmlElemMux.SetAttribute("test2", "0");

        myGrid.DataContext = xmlElemMux;            
    }
}

И, похоже, он правильно связывается и, соответственно, изменяет значение xmlElemMux, если я нажимаю флажок или изменяю текстовое поле. Часть преобразования может быть немного исправлена ​​... но это только иллюстрирует пример.

0 голосов
/ 17 декабря 2009

Это потому, что «1» и «0» не являются допустимыми значениями для «IsChecked». Это ищет "True" или "False". Вам нужен конвертер значений, чтобы заменить эти 1 и 0 на их логические аналоги.

Пример:

public class IntToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int intValue = (int)value;
        return (intValue != 0);  //returns true for any non-zero value         
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

Тогда в свой переплет включите конвертер:

<CheckBox IsChecked="{Binding XPath=@test1, Converter={StaticResource IntToBoolConverter}}"/>
<CheckBox IsChecked="{Binding XPath=@test2, Converter={StaticResource IntToBoolConverter}}"/>
...