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 的意思)最初我认为它们是不同的。
有谁知道如何为 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 的意思)最初我认为它们是不同的。