我有一个WPF Window
和UserControl
,我在Window
中使用它们。
窗口:
<Window x:Class="AdjacentControlVisualTree.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AdjacentControlVisualTree"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<StackPanel Orientation="Vertical">
<local:AdjacentControl x:Name="AdjacentControl"/>
<Button Content="Foo"
CommandParameter="{Binding SelectedItem, ElementName=AdjacentControl.BarDataGrid}"
Command="{Binding FooCommand}"/>
</StackPanel>
</Window>
UserControl:
<UserControl x:Class="AdjacentControlVisualTree.AdjacentControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AdjacentControlVisualTree">
<UserControl.DataContext>
<local:AdjacentViewModel/>
</UserControl.DataContext>
<Grid>
<DataGrid x:Name="BarDataGrid"
ItemsSource="{Binding Collection}"
IsReadOnly="True"
AutoGenerateColumns="False"
SelectionUnit="FullRow"
SelectionMode="Single">
<DataGrid.Columns>
<DataGridTextColumn Header="String" Binding="{Binding}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</UserControl>
现在,问题是,我想将AdjacentControl中DataGrid
的SelectedItem
属性传递给FooCommand命令,但绑定总是传递null:
CommandParameter="{Binding SelectedItem, ElementName=AdjacentControl.BarDataGrid}"
有没有一种方法可以在不改变控件结构的情况下使绑定工作?
发布于 2019-06-04 05:12:42
最简单的方法可能是将BarDataGrid
公开为一个属性。
更改XAML名称(例如,更改为x:Name="barDataGrid"
),并将此属性添加到UserControl的代码中:
public DataGrid BarDataGrid { get { return barDataGrid; } }
然后绑定到数据网格的SelectedItem属性,如下所示:
CommandParameter="{Binding BarDataGrid.SelectedItem, ElementName=AdjacentControl}"
更简洁的解决方案不是通过专用的依赖属性公开DataGrid子对象,而是只公开它的SelectedItem。
public static readonly DependencyProperty SelectedItemProperty =
System.Windows.Controls.Primitives.Selector.SelectedItemProperty.AddOwner(
typeof(AdjacentControl));
public object SelectedItem
{
get { return GetValue(SelectedItemProperty); }
set { SetValue(SelectedItemProperty, value); }
}
可以通过RelativeSource绑定将数据网格的SelectedItem绑定到此属性
<DataGrid SelectedItem="{Binding SelectedItem,
RelativeSource={RelativeSource AncestorType=UserControl}}"
并像这样绑定CommandParameter:
CommandParameter="{Binding SelectedItem, ElementName=AdjacentControl}"
https://stackoverflow.com/questions/56434162
复制相似问题