将一个控件绑定到另一个控件'
本文关键字:控件 另一个 绑定 一个 | 更新日期: 2023-09-27 18:08:02
我绑定我的wpf窗口应用程序层类(WindowVM.cs)使用DataContext
在windows .xaml.cs构造器(DataContext = WindowVM
)。但是,一个控件(btnAdd
)我想绑定到windows .xaml.cs属性。所以在windows。xaml.cs构造器我添加this.btnAdd.DataContext
。这是windows .xaml.cs构造器和属性,我想绑定Button
btnAdd
:
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'...
在next调用中,Add属性没有任何控制台输出错误。
现在我有点困惑了,因为这个错误。这个错误是因为第一个DataContext
(到WindowVM),因为没有属性添加,但行this.btnAdd.DataContext
属性添加被发现,这是它工作的原因吗?
在XAML中使用RelativeSource
:
Button
的DataContext
<Button Command="{Binding Add}" Content="Add" DataContext="{Binding Add, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" />
我有这个问题,我知道这是一个老帖子,但我认为这可能会帮助那些在未来偶然发现这个问题的人。
我所做的是将视图模型声明为资源
<Page.Resources>
<local:LocationListViewModel x:Key="LocationList" />
<local:LocationNewViewModel x:Key="NewLocation" />
<code:BinaryImageConverter x:Key="imgConverter" />
</Page.Resources>
然后我想与视图模型相关联的任何控件我将其添加到它们的数据上下文
<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 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}" />.....
它是绑定到新位置视图模型的表项的子元素。
当你设置datacontext属性时,你的窗口重置它的子控件的绑定。甚至你的纽扣的绑定。此时(在"按钮之前)。DataContext = this"被评估)在WindowVM中搜索"添加"。在此之后,您将窗口类设置为按钮DC,一切都很好。
为了避免初始错误,从
中交换两行public Window()
{
InitializeComponent();
DataContext = WindowVM;
this.btnAdd.DataContext = this;
}
public Window()
{
InitializeComponent();
this.btnAdd.DataContext = this;
DataContext = WindowVM;
}