1

MVVM Light Frameworkを使用して、Windows Phoneアプリでページを作成しようとしています。このページは、いくつかのUserControlの1つをプライマリUI要素として動的にロードします。UserControlがロードされ、ページの分離コードファイルに挿入されます。

public partial class HomePage
{
    private readonly UserControl _caseBrowser;

    public HomePage()
    {
        InitializeComponent();

        _caseBrowser = new StandardCaseBrowserControl { IsEnabled = true };
        DataContext = ((FBViewModelLocator)Application.Current.Resources["Locator"]).StandardCasesViewModel;
    }

    protected override void OnLoaded(object sender, RoutedEventArgs e)
    {
        base.OnLoaded(sender, e);

        // add a case browser to the content panel
        ContentPanel.Children.Add(_caseBrowser);

        // more stuff that is beyond the scope of this question
    }
}

各UserControlは、xaml内の独自のViewModelにもバインドされています。ページ自体を、ロードされているUserControlと同じViewModelにバインドしようとしています。

単純にDataContextを割り当ててみました。

        _caseBrowser = new StandardCaseBrowserControl { IsEnabled = true }; // the usercontrol
        DataContext = _caseBrowser.DataContext;

しかし、それはヌルになりました。

また、ViewModelLocatorによって提供される静的ViewModelにバインドしようとしました。

        _caseBrowser = new StandardCaseBrowserControl { IsEnabled = true };
        DataContext = FBViewModelLocator.StandardCasesViewModelStatic;

ただし、これによりビューモデルの新しいインスタンスが作成されるため、ページとユーザーコントロールはビューモデルの2つの別々のインスタンスで機能します。

また、アプリケーションリソースでviewmodelocatorのインスタンスを使用してみました。

        _caseBrowser = new StandardCaseBrowserControl { IsEnabled = true };
        DataContext = ((FBViewModelLocator)Application.Current.Resources["Locator"]).StandardCasesViewModel;

そして同じことが起こりました。

これを行うための良い方法があるかどうか、またはこれを破棄して別のアプローチを見つける必要があるかどうかを誰かが知っていますか?

4

1 に答える 1

1

ページの DataContext に割り当てようとしたときに、_caseBrowser の DataContext が設定されていない可能性があります。_caseBrowser の DataContextChanged イベントにサインアップし、_caseBrowser の DataContext が変更されたときにページの DataContext を割り当てることをお勧めします。何かのようなもの:

public HomePage()
{
    InitializeComponent();

    _caseBrowser = new StandardCaseBrowserControl { IsEnabled = true };
    _caseBrowser.DataContextChanged += _OnCaseBrowsesrDataContextChanged;
}


private void OnCaseBrowserDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if (_caseBrowser.DataContext != null)
        DataContext = _caseBrowser.DataContext;
}
于 2012-05-26T16:54:46.707 に答える