2010-05-07 25 views
1

我想显示包含有几个值从子窗口的属性之一来组合框的子窗口:绑定在XAML组合框的childwindow财产

public partial class MyChildWindow : ChildWindow 
{ 
    private ObservableCollection<MyClass> _collectionToBind = // initialize and add items to collection to make sure it s not empty... 

    public ObservableCollection<MyClass> CollectionToBind 
    { 
     get { return _collectionToBind; } 
     set { _collectionToBind = value; } 
    } 
} 

如何绑定在XAML我的组合框到ComboBoxContent集合(都在同一个班级)?我已经试过几件事情,如:

<ComboBox x:Name="linkCombo" ItemsSource="{Binding Path=CollectionToBind }" DisplayMemberPath="Description"> 

我只能够将它绑定在代码隐藏文件,并想学习XAML的方式来做到这一点。

谢谢!

回答

0

在这种情况下,我会用ElementToElement结合这样的: -

<ComboBox x:Name="linkCombo" ItemsSource="{Binding Path=Parent.CollectionToBind, ElementName=LayoutRoot }" DisplayMemberPath="Description"> 

你给ChildWindowLayoutRootx:Name的内容元素(在子窗口的标准模板,这是为完成您)。因此,您可以绑定到此已命名的元素,并使用其Parent属性导航到包含ChildWindow

使用DataContext = this很诱人,可以在简单场景中工作,但在DataContext已经采用这种方式时,在更复杂的需求中可能会遇到困难。

+0

谢谢!奇迹般有效! – 2010-05-07 21:21:35

0

您需要将ChildWindow的DataContext设置为包含要绑定到的值的内容。在这种情况下,您要将要绑定的值放在ChildWindow本身上,因此只需在构造函数中放置一行,将该DataContext分配给自己。

DataContext = this; 
0

您也可以在此使用的RelativeSource在XAML绑定,这样做:

{Binding Path=CollectionToBind, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}} 

然而,一个更好的方式做这将是把CollectionToBind在一个单独的类,并将其分配给窗口DataContext。现在,Window和XAML Bindings都可以引用与DataContext相同的类,并且可以将更多逻辑分离到此类中,而不是将它放在Window实现中。

+0

我相信FindAncestor只是WPF,而不是Silverlight。 – 2010-05-07 21:21:39

+0

D'oh!我总是缺少Silverlight标签。 – 2010-05-07 21:42:24