2

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

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

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

我在我的引用 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}}" />

在所有这一切之后,应用程序加载,但IsChecked设置为false......任何和所有想法在这里都会有所帮助;提前致谢!

4

1 回答 1

0

我发现了问题... XAML 未按%预期在文件路径中处理。为了更正,我从我的 XAMLXmlDataProvider声明中删除了以下内容:

Source="%appdata%\Vulnerator\Vulnerator_Config.xml" 
XPath="prefRoot" 

然后我在我的代码隐藏 (.xaml.cs) 中设置Sourceand属性:XPath

public MainWindow()
{
    InitializeComponent();

    Uri xmlPath = new Uri (Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\Vulnerator\Vulnerator_Config.xml");
    (this.Resources["XmlConfig"] as XmlDataProvider).Source = xmlPath;
    (this.Resources["XmlConfig"] as XmlDataProvider).XPath = "prefRoot";
}

现在,当应用程序加载时,复选框被设置为指定的 XML 节点的内部值。另外,我设置Binding Mode=TwoWayOneTime; 两种方式绑定到 XmlDataProvider 不会按预期发生。为了解决这个问题,我将绑定一个命令到复选框以使用新值更新Dictionary<string, string>(在我的视图模型构造器中启动时创建) 。IsChecked我将使用Dictionary来控制应用程序根据用户输入执行的操作,并Dictionary在应用程序关闭后将新用户值写入 XML 文件。

于 2014-02-22T19:59:14.313 回答