首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WPF:如何绑定到位于相邻控件的可视化树下的属性?

WPF:如何绑定到位于相邻控件的可视化树下的属性?
EN

Stack Overflow用户
提问于 2019-06-04 04:30:23
回答 1查看 198关注 0票数 0

我有一个WPF WindowUserControl,我在Window中使用它们。

窗口:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<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中DataGridSelectedItem属性传递给FooCommand命令,但绑定总是传递null:

代码语言:javascript
复制
CommandParameter="{Binding SelectedItem, ElementName=AdjacentControl.BarDataGrid}"

有没有一种方法可以在不改变控件结构的情况下使绑定工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-04 05:12:42

最简单的方法可能是将BarDataGrid公开为一个属性。

更改XAML名称(例如,更改为x:Name="barDataGrid"),并将此属性添加到UserControl的代码中:

代码语言:javascript
复制
public DataGrid BarDataGrid { get { return barDataGrid; } }

然后绑定到数据网格的SelectedItem属性,如下所示:

代码语言:javascript
复制
CommandParameter="{Binding BarDataGrid.SelectedItem, ElementName=AdjacentControl}"

更简洁的解决方案不是通过专用的依赖属性公开DataGrid子对象,而是只公开它的SelectedItem。

代码语言:javascript
复制
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绑定到此属性

代码语言:javascript
复制
<DataGrid SelectedItem="{Binding SelectedItem,
                         RelativeSource={RelativeSource AncestorType=UserControl}}"

并像这样绑定CommandParameter:

代码语言:javascript
复制
CommandParameter="{Binding SelectedItem, ElementName=AdjacentControl}"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56434162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档