我使用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,这是它起作用的原因吗?
答案 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;
}