TextBlock绑定到选定的DataGrid元素

时间:2016-03-15 17:40:06

标签: wpf xaml data-binding datagrid textblock

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

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

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

这可能吗?

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

1 个答案:

答案 0 :(得分:0)

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

您可以处理其中一个DataGrids&#39;代码隐藏中的事件,在处理程序中,您可以编写以下代码:

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

基本上你用这段代码重置TextBlock的Text属性上的Binding,其中:

  • textBlock是TextBlock的名称;

  • 使用TextBlock.TextProperty定义您要使用TextBlock上的Text属性;

  • 第三个参数是新的Binding本身。构造函数采用绑定路径,然后在&#34; body&#34;我设置了ElementName。

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

SelectionChanged可以是一个很好的事件来处理两个DataGrid,但是如果你想在你选择的时候更新TextBlock并在第一个中选择元素然后在第二个中选择另一个然后再点击回到第一个元素来更新然后你还需要处理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的意思)最初我认为它们是不同的。