IsChecked设置为false

时间:2014-10-15 03:04:59

标签: c# xml wpf

在上周搜索并尝试了几个选项后,我似乎无法找到我要找的东西;也许有人可以提供帮助。在阅读本文时,请记住我尽可能严格地使用MVVM,尽管我对WPF相对较新。作为旁注,我使用Mahapps.Metro来设置窗口和控件的样式,找到了here

我有一个我的应用程序用于配置的XML文件(我无法使用app.config文件,因为应用程序无法安装在用户的系统上)。应用程序将在启动时查找此文件,如果找不到该文件,则会创建该文件。以下是XML的摘录:

<?xml version="1.0" encoding="utf-8"?>
<prefRoot>
  <tabReport>
    <cbCritical>True</cbCritical>
  </tabReport>

我在XML

中引用了Window.Resources:文件
<Controls:MetroWindow.Resources>
        <XmlDataProvider x:Key="XmlConfig"
                         Source="%appdata%\Vulnerator\Vulnerator_Config.xml"
                         XPath="prefRoot"
                         IsAsynchronous="False"
                         IsInitialLoadEnabled="True"/>
</Controls:MetroWindow.Resources>

并将其用作DataContext

MainWindow:
<Controls:MetroWindow DataContext="{DynamicResource XmlConfig}">

接下来,我设置了一个“string-to-bool”转换器:

class StringToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            bool? isChecked = (bool?)value;
            return isChecked;
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            string isChecked = value.ToString();
            return isChecked;
        }
        return string.Empty;
    }
}

最后,我将IsChecked绑定到相应的XPath:

<Checkbox x:Name="cbCritical"
          Content="Critical"
          IsChecked="{Binding XPath=//tabReport/cbCritical, 
                      Converter={StaticResource StringToBool}}" />

完成所有这些后,applciation会加载,但IsChecked设置为false ...任何和所有想法都会对此有所帮助;提前谢谢!

1 个答案:

答案 0 :(得分:0)

两件事:

  1. 您的转换器最好不要返回null,但默认情况下为false。如果转换因任何原因失败,请返回实际值。
  2. 代码(bool?)value不会将字符串转换为布尔值。将其更改为:
  3. return (value.ToLower() == "true")