不知道这是否特定于 Infragistics xamDataGrid 但这里有一个问题:
Infragistics xamDataGrid 公开了一个属性 IsSynchronizedWithCurrentItem,根据他们的文档,该属性将 ActiveRecord 与实现 ICollectionView 的数据源的当前项同步。
我有以下 MasterDetails 窗口,其中包含基于绑定到网格的对象类型的详细信息 (ContentControl) 内容:
<DockPanel Name="dockPanel" LastChildFill="True">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="5" MaxHeight="5"/>
<RowDefinition/>
</Grid.RowDefinitions>
<igDP:XamDataGrid
Name="dataGrid"
IsSynchronizedWithCurrentItem="True"
SelectedItemsChanged="dataGrid_SelectedItemsChanged">
</igDP:XamDataGrid>
<GridSplitter
Style="{StaticResource blueHrizontalGridSplitter}"
Grid.Row="1" Grid.ColumnSpan="2"
BorderThickness="1" Margin="1,0"
HorizontalAlignment="Stretch" />
<ContentControl Grid.Row="2" Name="contentControl" />
</Grid>
</DockPanel>
在后面的代码中,我试图在我的 MasterDetailsWindow 的构造函数中建立网格数据源的当前项与详细信息控件的 DataContext 之间的链接,如下所示:
if (detailsControl != null)
{
var fwDControl = detailsControl as FrameworkElement;
if (fwDControl != null)
{
var b = new Binding() { ElementName = "dataGrid", Path = new PropertyPath("DataSource") };
fwDControl.SetBinding(DataContextProperty, b);
}
contentControl.Content = detailsControl;
}
else
{
var b = new Binding() { ElementName = "dataGrid", Path = new PropertyPath("DataSource") };
contentControl.SetBinding(ContentProperty, b);
b = new Binding("DataDetailsTemplate");
contentControl.SetBinding(ContentTemplateProperty, b);
}
在构造 MasterDetails 的实例时,调用者需要提供 detailsControl 对象或表示 DataTemplate 的 URL 的字符串。如果提供了 detailsControl,我将执行检查 details 是否不为空的代码。否则,我假设提供了 DataDetailsTemplate。
我会怀疑我的想法,但如果我构造一个 MasterDetails 窗口的实例,其 URL 可解析为以下 dataTemplate:
<DataTemplate x:Key="LogDetailsTemplate">
<Grid Margin="5,5,5,0">
<TextBox Text="{Binding Message}" TextWrapping="WrapWithOverflow"/>
</Grid>
</DataTemplate>
在网格中选择一个项目,在 TextBox 中显示所选对象的相应 Message 属性。
但是,如果我提供从 UserControl 派生的自定义 detailsControl 对象,则在网格中选择一个项目不会导致更改我的 detailsControl 的 DataContext。为什么是这样?
TIA。