如何将 UWP DataGrid 列 Header 模板中的控件绑定到 class 的实例?
How to I bind controls in a UWP DataGrid Column Header template to instances of a class?
我正在尝试自定义 UWP DataGrid. I can add the necessary controls by changing the header style like this 的 header 内容,但是我希望能够将模板内的控件绑定到 class 的实例仅在(动态)创建网格列时可用。
如何使下面代码中的绑定有效(或其他解决方法)?
DataGrid 示例 XAML:
<controls:DataGrid
x:Name="DataGrid"
ItemsSource="{x:Bind ItemsSource}"
AutoGenerateColumns="False"
ColumnHeaderHeight="80">
<controls:DataGrid.ColumnHeaderStyle>
<Style TargetType="controlsprimitives:DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controlsprimitives:DataGridColumnHeader">
<StackPanel Orientation="Vertical">
<TextBox Text="{x:bind PropertyOnMyClass, Mode=TwoWay}"/>
<!-- Some other controls -->
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</controls:DataGrid.ColumnHeaderStyle>
</controls:DataGrid>
添加的列示例:
private void MakeColumn(MyClass classInstance)
{
DataGridTextColumn column = new();
column.Header = classInstance;
DataGrid.Columns.Add(column);
}
我可以按上面的方式毫无问题地添加控件,我可以将 DataGridTextColumn Header 属性 设置为 class 实例并设置 header 文本在 class 上使用 GetString()
覆盖,但我找不到绑定到多个属性的方法。
在代码隐藏中创建 header 控件的解决方案也可以,但是您不能在代码隐藏中创建模板。
提前致谢。
所以我的解决方法是在第一次加载控件时调用一个方法来设置控件和 class 之间的必要链接:
XAML:
<controls:DataGrid.ColumnHeaderStyle>
<Style
TargetType="controlsprimitives:DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controlsprimitives:DataGridColumnHeader">
<ContentPresenter Loaded="HeaderLoaded"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</controls:DataGrid.ColumnHeaderStyle>
和后面的代码:
private void HeaderLoaded(object sender, RoutedEventArgs e)
{
var presenter = sender as ContentPresenter;
if (presenter.DataContext is MyClassType myClassInstance)
{
presenter.Content = new ColumnHeader(myClassInstance, this);
}
presenter.Loaded -= HeaderLoaded;
}
我正在尝试自定义 UWP DataGrid. I can add the necessary controls by changing the header style like this 的 header 内容,但是我希望能够将模板内的控件绑定到 class 的实例仅在(动态)创建网格列时可用。
如何使下面代码中的绑定有效(或其他解决方法)?
DataGrid 示例 XAML:
<controls:DataGrid
x:Name="DataGrid"
ItemsSource="{x:Bind ItemsSource}"
AutoGenerateColumns="False"
ColumnHeaderHeight="80">
<controls:DataGrid.ColumnHeaderStyle>
<Style TargetType="controlsprimitives:DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controlsprimitives:DataGridColumnHeader">
<StackPanel Orientation="Vertical">
<TextBox Text="{x:bind PropertyOnMyClass, Mode=TwoWay}"/>
<!-- Some other controls -->
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</controls:DataGrid.ColumnHeaderStyle>
</controls:DataGrid>
添加的列示例:
private void MakeColumn(MyClass classInstance)
{
DataGridTextColumn column = new();
column.Header = classInstance;
DataGrid.Columns.Add(column);
}
我可以按上面的方式毫无问题地添加控件,我可以将 DataGridTextColumn Header 属性 设置为 class 实例并设置 header 文本在 class 上使用 GetString()
覆盖,但我找不到绑定到多个属性的方法。
在代码隐藏中创建 header 控件的解决方案也可以,但是您不能在代码隐藏中创建模板。
提前致谢。
所以我的解决方法是在第一次加载控件时调用一个方法来设置控件和 class 之间的必要链接:
XAML:
<controls:DataGrid.ColumnHeaderStyle>
<Style
TargetType="controlsprimitives:DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controlsprimitives:DataGridColumnHeader">
<ContentPresenter Loaded="HeaderLoaded"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</controls:DataGrid.ColumnHeaderStyle>
和后面的代码:
private void HeaderLoaded(object sender, RoutedEventArgs e)
{
var presenter = sender as ContentPresenter;
if (presenter.DataContext is MyClassType myClassInstance)
{
presenter.Content = new ColumnHeader(myClassInstance, this);
}
presenter.Loaded -= HeaderLoaded;
}