我将三个DataGrids设置为单独的UserControls,每个ItemsSource绑定到UserControls中的不同DependencyProperty。当在第一个DataGrid中选择一行时,其他两个将填充与所选行相关的信息。虽然这很好,但我希望第二个和第三个DataGrid显示在第一个DataGrid的RowDetailsTemplate中。
我遇到的问题是,父ItemsSource的DataGrid比其他两个的要高,所以它们没有填充。我尝试过在其他许多类似的问题上发布解决方案,但没有一个解决了我的问题。我的代码在下面,我希望我刚刚错过了一些显而易见的东西,但是任何帮助都会很感激!
主数据格力
<DataGrid x:Name="PostDataGrid"
ItemsSource="{Binding WSEDriverList}"
SelectedItem="{Binding SelectedWSEDriverPOST}"
Style="{DynamicResource MainDataGridStyle}"
Margin="0,0,0,0"
Grid.Row="1" >
<DataGrid.Columns>
<DataGridTextColumn Header="HesId" Binding="{Binding HESID, Mode=OneWay}" Width="50"/>
<DataGridTextColumn Header="WseId" Binding="{Binding WSEID, Mode=OneWay}" Width="50"/>
<DataGridTextColumn Header="API" Binding="{Binding API, Mode=OneWay}" Width="198" />
<DataGridTextColumn Header="Request Date" Binding="{Binding Path=REQUEST_DATE, Mode=OneWay, StringFormat=dd/MM/yyyy HH:mm:ss}" Width="125"/>
<DataGridTextColumn Header="Result Date" Binding="{Binding Path=RESULT_DATE, Mode=OneWay, StringFormat=dd/MM/yyyy HH:mm:ss}" Width="125"/>
<DataGridTextColumn Header="Return Code" Binding="{Binding RETURN_CODE, Mode=OneWay, StringFormat=0}" Width="80" />
<DataGridTextColumn Header="Status" Binding="{Binding STATUS, Mode=OneWay, StringFormat=0}" Width="70" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate DataType="{x:Type viewmodel:WSEAuditViewModel}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Expander Header="NOTIFICATION" Grid.Row="0">
<ItemsControl ItemsSource="{Binding WSEDriverGETResult}">
<usercontrol:NOTIFICATIONUserControl/>
</ItemsControl>
</Expander>
<Expander Header="GET" Grid.Row="1">
<ItemsControl ItemsSource="{Binding WSEDriverGETResult}">
<usercontrol:GETUserControl/>
</ItemsControl>
</Expander>
</Grid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>DataGrid 2 (NOTIFICATIONUserControl)
<DataGrid x:Name="NotificationDG"
ItemsSource="{Binding NotificationResult}" DataGrid 3 (GETUserControl)
<DataGrid x:Name="GetDG"
ItemsSource="{Binding WSEDriverGETResult}" 编辑
以下是绑定到我的DependencyProperties的DataGrid代码。
//----POST result list from WSE_DRIVER-----
public List<WSE_DRIVER> WSEDriverList
{
get { return (List<WSE_DRIVER>)GetValue(WSEDriverListProperty); }
set { SetValue(WSEDriverListProperty, value); }
}
public static readonly DependencyProperty WSEDriverListProperty =
DependencyProperty.Register("WSEDriverList",
typeof(List<WSE_DRIVER>),
typeof(WSEAuditViewModel),
new PropertyMetadata(WSEDriverListChanged_Callback));
private static void WSEDriverListChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
WSEAuditViewModel wse_win = (WSEAuditViewModel)d;
if (wse_win.WSEDriverList.Count > 0)
{
wse_win.SelectedWSEDriverPOST = wse_win.WSEDriverList.First();
}
}
//----Selected POST WSE_Driver----
public WSE_DRIVER SelectedWSEDriverPOST
{
get { return (WSE_DRIVER)GetValue(SelectedWSEDriverPOSTProperty); }
set { SetValue(SelectedWSEDriverPOSTProperty, value); }
}
public static readonly DependencyProperty SelectedWSEDriverPOSTProperty =
DependencyProperty.Register("SelectedWSEDriverPOST",
typeof(WSE_DRIVER),
typeof(WSEAuditViewModel),
new PropertyMetadata(SelectedWSEDriverPOSTChanged_Callback));
private static void SelectedWSEDriverPOSTChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//Gets list and assigns to WSEDriverGETResult and NotificationResult
}
//----GET result from WSE_Driver----
public List<WSE_DRIVER> WSEDriverGETResult
{
get { return (List<WSE_DRIVER>)GetValue(WSEDriverGETResultProperty); }
set { SetValue(WSEDriverGETResultProperty, value); }
}
public static readonly DependencyProperty WSEDriverGETResultProperty =
DependencyProperty.Register("WSEDriverGETResult",
typeof(List<WSE_DRIVER>),
typeof(WSEAuditViewModel),
new PropertyMetadata(WSEDriverGETResultChanged_Callback));
private static void WSEDriverGETResultChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
//----Notification Info----
public List<SPEC_NOTIFICATION> NotificationResult
{
get { return (List<SPEC_NOTIFICATION>)GetValue(NotificationResultProperty); }
set { SetValue(NotificationResultProperty, value); }
}
public static readonly DependencyProperty NotificationResultProperty =
DependencyProperty.Register("NotificationResult",
typeof(List<SPEC_NOTIFICATION>),
typeof(WSEAuditViewModel),
new UIPropertyMetadata(NotificationResultChanged_Callback));
private static void NotificationResultChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}发布于 2017-05-23 12:07:47
由于NotificationResult和WSEDriverGETResult属性属于与WSEDriverList属性相同的类,所以您应该能够使用{RelativeSource}绑定到父DataGrid的DataContext。
<DataGrid x:Name="NotificationDG" ItemsSource="{Binding DataContext.NotificationResult,
RelativeSource={RelativeSource AncestorType=DataGrid}}"></DataGrid><DataGrid x:Name="GetDG" ItemsSource="{Binding DataContext.WSEDriverGETResult,
RelativeSource={RelativeSource AncestorType=DataGrid}}"></DataGrid>https://stackoverflow.com/questions/44132577
复制相似问题