1

Joost Van Schaik's article on tombstoningの手順に従って試してみましたが、それを動作させることができませんでした。私は何か間違っていることは間違いありません。私のViewModelで:MVVM-LightとWP7 ViewModelのトゥームストーンが機能しない

private string _foobar ="init"; 

public string testStr 
{ 
    get 
    { 
     return _foobar; 
    } 

    set 
    { 
     _foobar = value; 
    } 
} 

そして、私のページに:

<TextBox x:Name="tBoxTest" Text="{Binding testStr, Mode=TwoWay}" /> 

は、アプリケーションが実行されている間、tBoxTestセットで値を変更するだけで結構_foobar、それをシリアル化しようとすると、それが持っているかのようですインスタンスを忘れましたか?どんな助けでも大歓迎です。

+0

あなたが正常に見えるれ、あなたの財産のためのコードを示しましたが、あなたは解決策の残りの部分を実装しています実際には 'Activated'と' Deactivated'イベントでビューモデルのインスタンスを直列化して逆直列化しますか? –

+0

はい、あります。私はこのポストではっきりとしていたはずです。私は問題の一つに集中しようとしていました。 – Stonetip

答えて

0

投稿したコードから瞬時に回答がありません。これをデバッグする

私のアドバイスは、次のとおりです。

  • あなたはその記事からコードを正確にコピーした場合は、空のcatchハンドラに何か(メッセージボックスを?)を追加 - `キャッチ(例外){}

  • LoadModelとSaveToIsolatedStorageメソッドにブレークポイントを置くためにデバッガを使用

  • 読み込みと保存のコードをステップ実行するには、これらのブレークポイントを使用 - コードが正しくロードと保存されましたか?このような問題を、自分で少し調査を行うことは、ここに質問をするよりもはるかに優れています

正直に言うと、(IMO!)

+0

私はStack Overflowで新しく投稿しているので、他のすべてを試していない限り、私は決して質問を投稿しないことに言及しましょう。私は、上記のすべてのことをやって、それから日光をグーグルで見つけ、私が見つけた6つのサンプルを通してダウンロードして狩りました。私は解決策を持っていたので、Caliburn Microへの切り替えを検討しました。しかし、私はMVVM-Lightが好きで、すでにそれに時間を費やしています。そのコードを投稿することで私の前提は、他の誰かが記事のすべてのステップを実行したということでした。下記の記事を読んで、1つの解決策と私の部分についてさらに調査してください。 – Stonetip

+0

私は答えを提供した上記のポストになると思います。 (元の投稿に追加するのではなく、それが問題の答えだからです。 – Stonetip

+0

クール - 私も新しいです - この場合、最良のアドバイスはいくつかの – Stuart

1

私が持つと一緒に、仕事にツームストーン取得することができましたオブジェクトは、次の操作を実行して、すべての私のviewmodelsに見えること:

をモデルクラスでは、私が追加:

私は追加ApplicationExtensions.csで次に
private static Model1 _instance; 
public static Model1 Instance 
{ 
    get { return _instance; } 
    set { _instance = value; } 
} 

public static void CreateNew() 
{ 
    if (_instance == null) 
    { 
     _instance = new Model1(); 

     _instance.FirstString = "init"; 
    } 
} 

を:

public static void SaveToIsolatedStorage(this Application app, Model1 model) 
    { 
     var dataFileName = GetIsFile((model.GetType())); 
     using (var userAppStore = 
       IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      if (userAppStore.FileExists(dataFileName)) 
      { 
       userAppStore.DeleteFile(dataFileName); 
      } 
      using (var iss = userAppStore.CreateFile(dataFileName)) 
      { 
       SilverlightSerializer.Serialize(model, iss); 
      } 
     } 
    } 

そしてApp.xaml.csで、私は(LoadModelを変更)へ:

private void LoadModel() 
{ 
    try 
    { 
     Model1.Instance = this.RetrieveFromIsolatedStorage<Model1>(); 
    } 
    catch (Exception) { } 

    if (Model1.Instance == null) Model1.CreateNew(); 
} 

すべては私のViewModelファイルで、この作品のようなものをしたこと:

public string TestStr 
{ 
    get 
    { 
     return Model1.Instance.FirstString; 
    } 

    set 
    { 
     Model1.Instance.FirstString = value; 
    } 
} 

そして、それによって、私はModel1オブジェクトがシリアル化されていることを意味し、トーンブースティングはで動作しています - 少なくとも私は私が望むと思うものを得ています。私は、アプリ、電話の設定をナビゲートしたり、電話をオン/オフしたり、ロックしたり、別の電話からアプリ内で呼び出すことで、多くのことをテストしました。デシリアライズが優れている場合のパフォーマンスそして私はヴァルスと仕事ができます。

そう、「あなたはそれがないMVVMLight ViewModelBaseからサブクラス化された場合、その後、あなたはこのようなあなたのセッターからRaisePropertyChangedを呼び出す必要があります:_foobar =

プライベート文字列」:ヴァンSchaikがの支援のための要求に答えたのinit ";

パブリックストリングTestStr { {戻り_foobarを得る; }

set 
    { 
     RaisePropertyChanged("TestStr"); 
     _foobar = value; 
    } 
} 

RaisePropert yChangedはすべてのリスニングビュー(つまり、あなたがそれにバインドしたTextBox)プロパティが変更され、その内容を更新する必要があります。これは重要なメカニズムである。」

だから私は、私はもともとそれが何をするか見しようとしているが、RaisePropertyChangedを加えていたもので動作します。

UPDATE

私はRaisedPropertyChangedを実装しますが(私のMainViewModel.csファイルでコードスニペットmvvminpcを使用していますが、ViewModel内で作成されたものをシリアル化しても効果はありません(他のものと同じように)。ビューモデルは保護されたクラス(answer from Laurent Bugnion)から継承するためです。 antly)はそのクラスをprotectedからpublicに変更して再コンパイルしようとしましたが、私の場合は役に立たなかったので、そのような参照されたライブラリをforkするのは嫌です。とにかく、App.xaml.cでModel1インスタンスを作成するだけです仕事をしているようだ。私はそれであったが、私は、任意の型のオブジェクトを受け入れるためにヴァンSchaikの方法のいずれかを変更:

public static void SaveToIsolatedStorage<T>(this Application app, T obj) 
where T : class 
{ 
    var dataFileName = GetIsFile(typeof(T)); 
    using (var userAppStore = 
       IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     if (userAppStore.FileExists(dataFileName)) 
     { 
      userAppStore.DeleteFile(dataFileName); 
     } 
     using (var iss = userAppStore.CreateFile(dataFileName)) 
     { 
      SilverlightSerializer.Serialize(obj, iss); 
     } 
    } 
} 
関連する問題