如何在已设置DataContext时进行绑定

时间:2014-10-07 14:20:19

标签: c# wpf binding datacontext

我有一个自定义UserControl,其中我将DataContext设置为对某个对象的绑定。我还想基于父对象中对布尔值的绑定来启用或禁用控件。然而,这会失败,因为一旦设置了数据上下文,系统就会尝试在新数据上下文中找到所有其他绑定而不是旧数据上下文中的所有其他绑定。 (无论如何,这对我来说似乎有点奇怪。)

public class Animal
{
    public string Name;
}

public class Zoo
{
    public Zoo ()
    {
        AnimalOnDisplay = new AnimalOnDisplay { Name = "Tyrannosaurus" };
    }

     public bool ZooIsClosed;
     public Animal AnimalOnDisplay;
}

static void Main()
{
    ZooUserControl control = new ZooUserControl ();
    control.DataContext = new Zoo();
    control.Show();
}

XAML:

<UserControl x:Class="MyProgramme.ZooUserControl"
             xmlns:zoo="clr-namespace:Zoo.UserControls">
    <StackPanel>

        <Label Content="Welcome!" />
        <zoo:AnimalUserControl DataContext="{Binding AnimalOnDisplay}"
                               IsEnabled="{Binding ZooIsClosed}" />

    </StackPanel>
</UserControl>

上述用户控件的DataContextZoo的有效实例(我选中了这个)。这会出现以下错误:

 System.Windows.Data Error: 40 : BindingExpression path error: 'ZooIsClosed' property not found on 'object' ''Animal`1' (HashCode=44290843)'. 
                                 BindingExpression:Path=ZooIsClosed; DataItem='Animal`1' (HashCode=44290843); target element is 'AnimalUserControl' (Name=''); 
                                 target property is 'IsEnabled' (type 'Boolean')

很明显,它在错误的地方寻找ZooIsClosed。我试图将它绑定到当前DataContext,如下所示:

 IsEnabled="{Binding ZooIsClosed, RelativeSource={RelativeSource Self}}"

产生相同的错误,并且ElementName产生了相同的错误。

如何将其绑定到正确的变量(即ZooIsClosed中的Zoo)?

2 个答案:

答案 0 :(得分:1)

您可以使用Binding跟踪IsEnabled这样设置RelativeSource的{​​{1}}:

UserControl

请注意,<zoo:AnimalUserControl DataContext="{Binding AnimalOnDisplay}" IsEnabled="{Binding DataContext.ZooIsClosed, RelativeSource={RelativeSource AncestorType=UserControl}}"/> 设置为Path

此外,您的模型编写得不好(我希望它只是示范性的)。

答案 1 :(得分:0)

您要求绑定在AnimalOnDisplay属性上搜索名为ZooIsClosed的属性。我们可以从你的代码背后看到这种关系不存在。

因为ZooIsClosedAnimalOnDisplay都是Zoo类的属性,所以您应该将DataContext设置为Zoo类实例(假设您的ZooControl具有一个Zoo实例DependencyProperty),然后绑定到该实例上的属性,即IsZooClosedAnimalOnDisplay

这里有一些代码可以帮助您入门,看看它是否符合您的需求:

<UserControl x:Class="MyProgramme.ZooUserControl"
         xmlns:zoo="clr-namespace:Zoo.UserControls"
         DataContext="{Binding Zoo.DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type zoo:ZooControl}}}">
    <StackPanel>
        <Label Content="Welcome!" />
        <zoo:AnimalUserControl IsEnabled="{Binding ZooIsClosed}" />
    </StackPanel>
</UserControl>