1

我正在尝试使用 MVVM Light Framework 在我的 Windows Phone 应用程序中创建一个页面,该页面将动态加载多个 UserControl 之一作为其主要 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;

但这会创建视图模型的新实例,因此页面和用户控件正在处理视图模型的两个单独实例。

我还尝试在应用程序资源中使用 viewmodelocator 的实例:

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

同样的事情也发生了。

有谁知道是否有这样做的好方法,或者我是否应该放弃这个并找到不同的方法?

4

1 回答 1

1

当您尝试将 _caseBrowser 的 DataContext 分配给页面的 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 回答