Prism v4,MEF WPF DataBinding

时间:2011-02-10 21:34:49

标签: c# wpf data-binding prism mef

首先,关于数据绑定的几个问题:

  • 控件的默认DataContext是否设置为代码隐藏?例如,如果我在test.xaml.cs中有变量orderNumber,我可以在xaml {Binding orderNumber}中像这样引用它吗?
  • 我只能数据绑定到对象的属性是否正确?

我在一个单独的模块/程序集中有一个Prism服务,我通过MEF导入我的Shell应用程序。我正在尝试对它进行数据绑定,但它似乎没有起作用。

我的解决方法如下。 在我的Shell.xaml.cs中:

[Import(AllowRecomposition = false)]
private IRibbonService _menuService;
public IRibbonService MenuService
{
    get
    {
        return _menuService;
    }
}


public void OnImportsSatisfied()
{
    Debug.WriteLine("Imports satisfied", "Prism");
    this._moduleManager.LoadModuleCompleted += new EventHandler<LoadModuleCompletedEventArgs>(moduleManager_LoadModuleCompleted);

    //TODO figure out how to properly bind to the ribbon
    Ribbon.DataContext = _menuService;
    RibbonAppMenu.DataContext = _menuService.ApplicationMenuData;
}

有没有办法在设置对象之前在xaml中设置datacontext - 特别是在MEF / Prism场景方面?在我的功能区对象上,我尝试DataContext="{Binding MenuService}",但这不起作用。

1 个答案:

答案 0 :(得分:4)

  

控件的默认DataContext是否设置为代码隐藏?例如,如果我在test.xaml.cs中有一个变量orderNumber,我可以在xaml {Binding orderNumber}中像这样引用它吗?

没有。默认情况下,没有DataContext,它使用WPF中的层次结构机制从父级继承。如果需要控件,则需要为控件显式设置DataContext。

  

我只能数据绑定到对象的属性是否正确?

是。您只能绑定到属性。如果您希望双向绑定工作,则该对象也必须是DependencyObject或实现INotifyPropertyChanged

  

有没有办法在设置对象之前在xaml中设置datacontext - 特别是在MEF / Prism场景方面?在我的功能区对象上,我尝试了DataContext =“{Binding MenuService}”,但这不起作用。

这将尝试使用层次结构将DataContext设置为包含DataContext的MenuService属性(即:父控件/窗口的DataContext的MenuService属性)。您无法绑定到自己来设置DataContext。

您可以在XAML中创建一个新对象以用作DataContext,或者让一个包含对象为您提供DataContext。