1

私は、Windows Phone での MVVM 統合の初心者です。2 つの異なるビュー ( TilesView[xaml+cs] と MainPage[xaml+cs] ) と 2 つの ViewModel (MainViewModel.cs と TilesViewModel.cs) があり、次に MainPage.xaml があります。MainPage のホーム ボタンが押されたときに、TilesView を MainPage に出力したいと考えています。TilesView には、私のタイルを持つ Canvas が含まれています。TilesView を含めるには、MainView のどのコントロールを使用すればよいですか? その MainPage の HomeButton が押された後、MainPage にビューを出力するたびに、LaodTiles という名前の関数を呼び出す必要があります。その関数をどこでどのように定義しますか?

私は主に MVVM 構造を統合して、リソースをより適切に管理し、MainPage を可能な限り軽くして、どの設計コンポーネントを最初に起動し、何を遅らせる必要があるかを制御することで、アプリケーションの起動時に読み込みを高速化しました。Tiles ビューは MainPage から削除したもので、後で読み込むようにしました。閉じると、一部のリソースが解放されます。

したがって、私はこの方法で VMLocator で MVVM 配線を行うことができました (これが続行する方法でない場合は、私を修正してください):

...
public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<MainViewModel>();
        SimpleIoc.Default.Register<TilesHomeViewModel>();
    }

    public MainViewModel Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

    public TilesHomeViewModel TilesVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<TilesHomeViewModel>();
        }
    }
...

私の TilesView には、次の一般的な構造があります。

<phone:PhoneApplicationPage x:Class="myAppName.Views.TilesHomeView" ... >
    <Grid x:Name="HomeGrid" ...>
        <Canvas x:Name="TilesCanvas" >
        ...

私の TilesHomeViewModel では、 INotifyPropertyChanged に設定しました (繰り返しますが、私は MVVM の初心者であるため、この問題に取り組む方法についての理解が不足している可能性があります)。定義方法は次のとおりです。

public class TilesHomeViewModel : INotifyPropertyChanged
{
    private string loadHomeContent;
    public string LoadHomeContent
    {
        get
        {
            return loadHomeContent;
        }
        set
        {
            loadHomeContent = value;
            NotifyPropertyChanged("LoadHomeContent");
        }
    }

    public TilesHomeViewModel()
    {

    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

私の MainPage.xaml には、gridrows が定義されたグリッドがある場所があります。Gridrow=0 は TilesView 用に予約されているため、TilesView が MainPage にポップアップ/ロードされると、その gridrow セクションが埋められます。グリッド行スペースを予約することが解決策ではない、または必要ない場合は、他のヒント/解決策を教えていただければ幸いです。コードビハインドのように呼び出されるたびに TilesView を再配置する別の方法があるかもしれません。

以前に尋ねた質問へのヒント、コード、またはチュートリアルのリンクは役に立ちます。ありがとう

4

1 に答える 1

0

私は大規模な Windows Phone アプリ (MapQuest) に取り組み、他の開発者と私自身が思いついた設計哲学は、MVVM を使用することでしたが、ビュー/ページは 1 つだけで、すべてのビュー (この場合はコントロールとして) を設定することでロードするだけでした。必要に応じて、エンドユーザーにはページをステップスルーするように見えます。

そうは言っても、物事を行う唯一の方法はなく、あなたの方法は他の人の方法と同じくらい有効かもしれません. 上記と同様のことを行い、1 つのページを維持することをお勧めしますが、必要に応じて複数の ViewModel またはすべてのデータを含む 1 つのビュー モデルを引き続き使用し、表示されるビューを入れ替えます。

ビューの処理に関しては、メインページの分離コードで各ビュー/コントロールを有効にします。

または、ビューステートを提供するビューモデルの列挙型に各コントロール (ビュー) をバインドします。各コントロール (ビュー) は、列挙型が返すものを受け取り、状態に応じてそれ自体を表示するかどうかを認識します。

その列挙型のターゲット ユーザー コントロール/ビューに依存関係プロパティを配置する必要があります。Helpful Silverlight Snippetsからこれらのスニペットをインストールすることをお勧めします(Silverlight、WPF、WP8 コードに使用したことは心配しないでください)。上記の列挙型の変更ハンドラーを使用して値型の依存関係プロパティを追加し、変更ハンドラーでコントロールをオンまたはオフにする必要があります。

MVVM にこだわりすぎないでください。MVVM は、ビジネス ロジックとビュー ロジックを処理ロジックから分離する 3 層アーキテクチャを実現するためのより洗練された方法です。主なことは、VM にバインドし、VM でデータのほとんどの処理を行うことですが、その処理のためにビューにバインドされたデータをオンまたはオフにすることを除いて、ビュー ロジックを直接行うことはありません。

于 2013-09-25T21:44:23.100 に答える