WFP - 重用 DataGrid 列和资源
WFP - Reuse DataGrid columns and resources
我有一个带有两个 DataGrid
控件的应用程序。尽管它们 ItemsSource
绑定到不同的集合,但它们的项类型、列、样式和事件处理程序完全相同。
随着他们的 XAML 代码变得越来越大,我如何创建相同的“内容”并在两个 DataGrid 中重用它?
我目前拥有的是:
<DataGrid x:Name="LeftGrid"
ItemsSource="{Binding LeftCollection}"
Grid.Column="0"
CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False">
<!--exactly the same code from this forward-->
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Type" Binding="{Binding Type, Mode=OneWay}" IsReadOnly="True"/>
<DataGridTextColumn Header="Status" Binding="{Binding Status, Mode=OneWay}" IsReadOnly="True"/>
...............................
................................
.....................................
</DataGrid.Columns>
</DataGrid>
然后我“exaclty”复制了相同的数据网格,其唯一的变化是Name
、Grid.Column
和ItemsSource
(只有XAML的前三行) :
<DataGrid x:Name="RightGrid"
ItemsSource="{Binding RightCollection}"
Grid.Column="1"
CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False">
<!--exactly the same code from this forward-->
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Type" Binding="{Binding Type, Mode=OneWay}" IsReadOnly="True"/>
<DataGridTextColumn Header="Status" Binding="{Binding Status, Mode=OneWay}" IsReadOnly="True"/>
...............................
................................
.....................................
</DataGrid.Columns>
</DataGrid>
乍一看最简单的方法是把它放到UserControl
,然后在主视图中使用。
<UserControl x:Class="YourNameSpace.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
</UserControl.Resources>
<Grid>
<DataGrid ItemsSource="{Binding}">
<!-- ... -->
</DataGrid>
</Grid>
</UserControl>
然后你可以使用:
xmlns:local="clr-namespace:YourNameSpace"
<local:UserControl1 x:Name="LeftGrid" DataContext="{Binding LeftCollection}" Grid.Column="0"/>
<local:UserControl1 x:Name="RightGrid" DataContext="{Binding RightCollection}" Grid.Column="1"/>
如果你不想将一个集合作为DataContext
用于整个UserControl
,那么你当然可以在[=]中为集合创建一个专用的依赖属性 12=] 并将其绑定到 DataGrid.ItemsSource
.
我有一个带有两个 DataGrid
控件的应用程序。尽管它们 ItemsSource
绑定到不同的集合,但它们的项类型、列、样式和事件处理程序完全相同。
随着他们的 XAML 代码变得越来越大,我如何创建相同的“内容”并在两个 DataGrid 中重用它?
我目前拥有的是:
<DataGrid x:Name="LeftGrid"
ItemsSource="{Binding LeftCollection}"
Grid.Column="0"
CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False">
<!--exactly the same code from this forward-->
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Type" Binding="{Binding Type, Mode=OneWay}" IsReadOnly="True"/>
<DataGridTextColumn Header="Status" Binding="{Binding Status, Mode=OneWay}" IsReadOnly="True"/>
...............................
................................
.....................................
</DataGrid.Columns>
</DataGrid>
然后我“exaclty”复制了相同的数据网格,其唯一的变化是Name
、Grid.Column
和ItemsSource
(只有XAML的前三行) :
<DataGrid x:Name="RightGrid"
ItemsSource="{Binding RightCollection}"
Grid.Column="1"
CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False">
<!--exactly the same code from this forward-->
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Type" Binding="{Binding Type, Mode=OneWay}" IsReadOnly="True"/>
<DataGridTextColumn Header="Status" Binding="{Binding Status, Mode=OneWay}" IsReadOnly="True"/>
...............................
................................
.....................................
</DataGrid.Columns>
</DataGrid>
乍一看最简单的方法是把它放到UserControl
,然后在主视图中使用。
<UserControl x:Class="YourNameSpace.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
</UserControl.Resources>
<Grid>
<DataGrid ItemsSource="{Binding}">
<!-- ... -->
</DataGrid>
</Grid>
</UserControl>
然后你可以使用:
xmlns:local="clr-namespace:YourNameSpace"
<local:UserControl1 x:Name="LeftGrid" DataContext="{Binding LeftCollection}" Grid.Column="0"/>
<local:UserControl1 x:Name="RightGrid" DataContext="{Binding RightCollection}" Grid.Column="1"/>
如果你不想将一个集合作为DataContext
用于整个UserControl
,那么你当然可以在[=]中为集合创建一个专用的依赖属性 12=] 并将其绑定到 DataGrid.ItemsSource
.