TextBlock 绑定到选定的 DataGrid 元素

TextBlock binding to selected DataGrid Element

有谁知道如何为 textblock.text 绑定动态设置 ElementName?

我有两个具有相同信息的数据网格,但第二个数据网格只是同一数据源的过滤器,但我想要的是将文本块的文本绑定到所选项目,具体取决于项目是否在主数据网格或辅助数据网格。

我有以下代码将文本块绑定到一个数据网格,但如果用户单击第二个数据网格中的项目,我也希望发生同样的情况。

这可能吗?

<TextBlock Margin="29,0" Text="{Binding SelectedItem.Name, ElementName=MainDataGrid}"

这是可能的,但我认为这不是正确的解决方案。

您可以在代码隐藏中处理 DataGrids 的事件之一,在处理程序中您可以编写以下代码:

BindingOperations.SetBinding(textBlock, TextBlock.TextProperty,
                             new Binding("SelectedItem.Name")
                             {
                                 ElementName = "DataGrid1"
                             });

基本上,您使用此代码重置了 TextBlock 文本 属性 上的绑定,其中:

  • textBlock 是您的 TextBlock 的名称;

  • with TextBlock.TextProperty 您定义要使用 TextBlock 上的文本 属性;

  • 第三个参数是新的Binding本身。构造函数采用绑定路径,然后在 "body" 中设置 ElementName.

如果 DataGrid1 触发事件,则将 ElementName 设置为该 DataGrid 的名称,如果 DataGrid2 触发事件,则将 ElementName 设置为第二个 DataGrid 的名称。

SelectionChanged 可能是处理两个 DataGrid 的好事件,但如果您希望在第一个 selected 和元素时更新 TextBlock,然后 select 第二个和然后单击回到要更新的第一个元素,然后您还需要处理 GotFocus 事件。 稍微玩一下,你就会明白我的意思了。

我的工作示例:

private void SetBindingOnTextBlock(string elementName)
{
    BindingOperations.SetBinding(textBlock, TextBlock.TextProperty, new Binding("SelectedItem.Name")
    {
        ElementName = elementName
    });
}

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    SetBindingOnTextBlock("DataGrid1");
}

private void DataGrid_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
    SetBindingOnTextBlock("DataGrid2");
}

private void DataGrid1_GotFocus(object sender, RoutedEventArgs e)
{
    SetBindingOnTextBlock("DataGrid1");
}

private void DataGrid2_GotFocus(object sender, RoutedEventArgs e)
{
    SetBindingOnTextBlock("DataGrid2");
}

更新 1:

设置

IsSynchronizedWithCurrentItem="True"

在 DataGrids 上,如果 ItemsSources 相同,它可能会解决您的问题。 (不确定这是不是@dkozl 的意思)最初我认为它们是不同的。