2016-05-05 8 views
-1

すべての依存プロパティデータを保存/ロードするUIを作成しています。このためWPFのUIデータをJSONで保存して読み込みシリアル化/逆シリアル化

私は私のDataContextでクラスを持っている:

public class CMiX_Data : DependencyObject 
{ 
    public static readonly DependencyProperty TestProperty = 
    DependencyProperty.Register("Test", typeof(ObservableCollection<bool>), typeof(CMiX_UI), new PropertyMetadata(new ObservableCollection<bool>(new[] { false, false, false, false, false, false }))); 
    [Bindable(true)] 
    public ObservableCollection<bool> Test 
    { 
     get { return (ObservableCollection<bool>)this.GetValue(TestProperty); } 
     set { this.SetValue(TestProperty, value); } 
    } 

    public static readonly DependencyProperty Test2Property = 
    DependencyProperty.Register("Test2", typeof(ObservableCollection<bool>), typeof(CMiX_UI), new PropertyMetadata(new ObservableCollection<bool>(new[] { false, false, false, false, false, false }))); 
    [Bindable(true)] 
    public ObservableCollection<bool> Test2 
    { 
     get { return (ObservableCollection<bool>)this.GetValue(Test2Property); } 
     set { this.SetValue(Test2Property, value); } 
    } 
} 
} 

は今ここにシリアライズ/デシリアライゼーションのためのJSONメソッドを保存するクラスは、次のとおりです。

public static class JsonSerialization 
{ 
    public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new() 
    { 
     TextWriter writer = null; 
     try 
     { 
      var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite); 
      writer = new StreamWriter(filePath, append); 
      writer.Write(contentsToWriteToFile); 
     } 
     finally 
     { 
      if (writer != null) 
       writer.Close(); 
     } 
    } 

    public static T ReadFromJsonFile<T>(string filePath) where T : new() 
    { 
     TextReader reader = null; 
     try 
     { 
      reader = new StreamReader(filePath); 
      var fileContents = reader.ReadToEnd(); 
      return JsonConvert.DeserializeObject<T>(fileContents); 
     } 
     finally 
     { 
      if (reader != null) 
       reader.Close(); 
     } 
    } 
} 
} 

最後に、これはどこのUserControlクラスです読み込みと保存のイベントが発生します。

public partial class CMiX_UI : UserControl, INotifyPropertyChanged, ISupportsUndo 
{ 
    private event EventHandler OnSelect; 
    public event PropertyChangedEventHandler PropertyChanged; 
    CMiX_UserControl.Properties.Settings Pouet = new CMiX_UserControl.Properties.Settings(); 

    CMiX_Data data = new CMiX_Data(); 

    public CMiX_UI() 
    { 
     InitializeComponent(); 
     this.DataContext = data; 
    } 

    private void MenuSave_Click(object sender, RoutedEventArgs e) 
    { 
     JsonSerialization.WriteToJsonFile<CMiX_Data>(@"D:\pouet.txt", data, true); 
    } 

    private void MenuLoad_Click(object sender, RoutedEventArgs e) 
    { 
     data = JsonSerialization.ReadFromJsonFile<CMiX_Data>(@"D:\pouet.txt"); 
    } 

両方のイベントがUIの2つの異なるボタンによって起動されます。プロパティ情報を含むファイルが正しく保存されます。

問題は:ロードは何もしていない、私はボタンを押してプロパティのデータを読み込むときに何もUIで変更されません。

これはDependencyPropertyと何か関係があることがわかりました。通常のプロパティは正しくデシリアライズされています。

答えて

0

あなただけのDataContextに新しいデータを設定する必要があります。

data = JsonSerialization.ReadFromJsonFile<CMiX_Data>(@"D:\pouet.txt"); 
DataContext = data; 
+0

それはまだ動作しません。プロパティはトグルボタンにリンクされています。ロード時に差異があるかどうかを確認するために保存したものとは異なるものに変更します。何も起こっていないのは、この行が何もしていないテストの後に – lecloneur

+0

です:data = JsonSerialization.ReadFromJsonFile (@ "D:\ pouet.txt"); MessageBox.Show( "hello")を追加した場合も同様です。メッセージボックスは表示されません... – lecloneur

+0

その行の前にmessageboxを追加した場合は、 – Liero

関連する問題