将一个控件绑定到另一个控件的DataContext

时间:2011-09-09 19:23:33

标签: c# wpf xaml data-binding datacontext

我使用Window.xaml.cs构造函数(DataContext)中的DataContext = WindowVM将我的wpf窗口绑定到app层类(WindowVM.cs)。但是,我想绑定到Window.xaml.cs属性的一个控件(btnAdd)。所以在Window.xaml.cs构造函数中我添加了this.btnAdd.DataContext。这是我想要绑定Button btnAdd的Window.xaml.cs构造函数和属性:

    public Window()
    {
        InitializeComponent();
        DataContext = WindowVM;
        this.btnAdd.DataContext = this;
    }

    public RelayCommand Add
    {
        get
        {
            return _add == null ? _add= new RelayCommand(AddPP, CanAddPP) : _add;
        }
        set
        {
            OnPropertyChanged("Add");
        }
    }

Xaml看起来像这样(PP类是WindowVM属性):

<TextBox Name="txtName" Text="{Binding PP.Name, ValidatesOnDataErrors=true, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Name="txtSurname" Text="{Binding PP.Surname, ValidatesOnDataErrors=true, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="{Binding Add}" Content="Add" ... />

并且 - 一切正常,但控制台输出:

BindingExpression path error: 'Add' property not found on 'object' ''WindowVM'...

在下一次调用中,属性Add。

没有任何控制台输出错误

现在我因为这个错误而有点困惑。这个错误是因为第一个DataContext(对于WindowVM),因为没有属性Add,但是找到了行this.btnAdd.DataContext属性Add,这是它起作用的原因吗?

3 个答案:

答案 0 :(得分:2)

只需使用DataContext设置XAML中Button的{​​{1}}:

RelativeSource

答案 1 :(得分:1)

我有这个问题,我知道这是一个古老的帖子,但我认为这可能有助于将来偶然发现这个问题的人。

我所做的是将viewmodels声明为资源

<Page.Resources>
    <local:LocationListViewModel x:Key="LocationList" />
    <local:LocationNewViewModel x:Key="NewLocation" />
    <code:BinaryImageConverter x:Key="imgConverter" />
</Page.Resources>

然后控制我想要与所述viewmodel关联我将它添加到他们的datacontext

<TabItem x:Name="tabSettingsLocations" x:Uid="tabSettingsLocations" 
                 Header="Locations"
                 DataContext="{StaticResource ResourceKey=LocationList}">....

<TabItem x:Name="tbSettingsLocationsAdd" x:Uid="tbSettingsLocationsAdd" 
         Header="Add New"
         DataContext="{StaticResource ResourceKey=NewLocation}">....

<Image x:Name="imgSettingsLocationMapNew" x:Uid="imgSettingsLocationMapNew" 
         Source="{Binding Map, Converter={StaticResource imgConverter}, 
         Mode=TwoWay}"
         DataContext="{StaticResource ResourceKey=NewLocation}" />

因此,在上面的示例中,我将Listview绑定到列表视图模型,并为新条目创建一个新的单个位置。您会注意到,通过将其创建为资源,我可以将tabitem和图像(不是标签项的子项)绑定到新的位置视图模型。

我对addnew位置的命令位于新位置视图模型中。

<TabItem x:Name="tbSettingsLocationsAdd" x:Uid="tbSettingsLocationsAdd" 
         Header="Add New"
         DataContext="{StaticResource ResourceKey=NewLocation}">....

    <Button x:Name="btnSettingsLocationSaveAdd" x:Uid="btnSettingsLocationSaveAdd" Content="Submit" Margin="0,80,10,0" 
        VerticalAlignment="Top" Style="{DynamicResource ButtonStyle}" HorizontalAlignment="Right" Width="75"
        Command="{Binding AddCommand}" />.....

我绑定到新位置视图模型的tabitem的子节点。

我希望有所帮助。

答案 2 :(得分:0)

当您设置DataContext-Property时,您的Window会重置其子控件的Bindings。甚至是按钮的绑定。 在此点(在评估“button.DataContext = this”之前)在WindowVM中搜索“添加”。在此之后,您将Window类设置为按钮DC,一切正常。

要避免初始错误,请从此

交换两行
public Window()
{
    InitializeComponent();
    DataContext = WindowVM;
    this.btnAdd.DataContext = this;
}

到这个

public Window()
{
    InitializeComponent();
    this.btnAdd.DataContext = this;
    DataContext = WindowVM;
}