在上周搜索并尝试了几个选项之后,我似乎找不到我要找的东西;也许这里有人可以提供帮助。在阅读本文时,请记住我正在尝试尽可能严格地使用 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
......任何和所有想法在这里都会有所帮助;提前致谢!