2014-02-18 59 views
1

在上週搜索並嘗試了幾個選項之後,我似乎無法找到我在找的內容;也許這裏有人可以幫忙。在閱讀這篇文章時,請記住,我儘可能嚴格地使用MVVM,儘管我對WPF比較陌生。作爲一個方面說明,我使用Mahapps.Metro來設置我的窗口和控件,發現here通過XmlDataProvider(利用MVVM)綁定複選框「IsChecked」值到外部XML文件

我有一個XML文件,我的應用程序用於配置(我無法使用app.config文件,因爲應用程序無法安裝在用戶的系統上)。應用程序將在啓動時查找此文件,如果找不到該文件,它將創建它。下面是XML的一個片段:

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

我引用我Window.Resources XML文件:

<Controls:MetroWindow.Resources> 
     <XmlDataProvider x:Key="XmlConfig" 
         Source="%appdata%\Vulnerator\Vulnerator_Config.xml" 
         XPath="prefRoot" 
         IsAsynchronous="False" 
         IsInitialLoadEnabled="True"/> 
</Controls:MetroWindow.Resources> 

而且利用這個作爲DataContextMainWindow

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

接下來,我建立了一個「字符轉換器」轉換器:

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 ...任何和所有的想法都將是有益的在這裏;提前致謝!

回答

0

我想出了這個問題...... XAML不按預期在文件路徑中處理%。要糾正,我刪除了從我的XAML以下XmlDataProvider聲明:

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

我然後設置在我的代碼隱藏(.xaml.cs)的SourceXPath屬性:

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=TwoWay設置爲OneTime;按預期方式不會發生雙向綁定到XmlDataProvider的方式。爲了解決這個問題,我打算將一個命令綁定到複選框,以便用新的IsChecked值更新Dictionary<string, string>(在我的視圖模型構造器中啓動時創建)。我將使用Dictionary來控制基於用戶輸入的應用程序的功能,並在應用程序關閉後將新的Dictionary用戶值寫入XML文件。

相關問題