使模板视图对外部参数可见
Getting template view visible to outside parameters
在 XAML 世界中,我在公开 template/style 的数据以供查看时遇到问题,它正在使用此 template/style。这是一个例子。
第一个样式模板:
<Style TargetType="myStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="myStyle">
<telerik:RadGridView Name="SomeName"
ItemsSource="{TemplateBinding SomeSource}"
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding SomeBinding}" Header="SomeHeader"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding SomeBinding2}" Header="SomeHeader2" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding SomeBinding3}" Header="SomeHeader3" IsReadOnly="True">
<telerik:GridViewDataColumn.CellTemplate>
<DataTemplate>
<Controls DataContext="{Binding SomeBinding4}" />
</DataTemplate>
</telerik:GridViewDataColumn.CellTemplate>
</telerik:GridViewDataColumn>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
和 xaml 将使用它的文件:
<myStyle
Grid.Row="0"
SomeSource="{Binding SomeExternalSource}">
<!-- I want here behaviour that will interact with myStyle Columns for example exporting this data to excel-->
</myStyle>
当您创建自定义 Controls
或 Views
并且您希望它们具有一些(技术)界面,以便您可以使用 xaml 标记或代码与您的自定义类型进行交互, 我建议你加上 public DependencyProperties
.
假设您有一个控件 MySpecialGrid
public class MySpecialGrid : Control
{
ctor() {
DefaultStyleKey = typeof(MySpecialGrid);
Columns = new RadGridViewColumnsConfiguration();
}
public RadGridViewColumnsConfiguration Columns
{
get { return (RadGridViewColumnsConfiguration) GetValue( ColumnsProperty ); }
set { SetValue( ColumnsProperty, value ); }
}
public static readonly DependencyProperty ColumnsProperty =
DependencyProperty.Register( "Columns", typeof( RadGridViewColumnsConfiguration),
typeof( MySpecialGrid), null );
}
MySpecialGrid
的默认样式
<Style TargetType="MySpecialGrid">
<Setter Property="Columns">
<Setter.Value>
<RadGridViewColumnsConfiguration>
<GridViewDataColumn DataMemberBinding="{Binding SomeBinding}" Header="SomeHeader"/>
<GridViewDataColumn DataMemberBinding="{Binding SomeBinding2}" Header="SomeHeader2"/>
<GridViewDataColumn DataMemberBinding="{Binding SomeBinding3}" Header="SomeHeader3">
<GridViewDataColumn.CellTemplate>
<DataTemplate>
<... />
</DataTemplate>
</GridViewDataColumn.CellTemplate>
</GridViewDataColumn>
</RadGridViewColumnsConfiguration>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MySpecialGrid">
<RadGridView Columns="{TemplateBinding Columns}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
您现在可以像这样从控件外部访问它:
<MySpecialGrid x:Name="FeeblefezerDataGrid" ... />
<MyExcelExportButton Content="Export To Excel"
ColumnsConfiguration="{Binding ElementName=FeeblefezerDataGrid, Path=Columns}"/>
在 XAML 世界中,我在公开 template/style 的数据以供查看时遇到问题,它正在使用此 template/style。这是一个例子。 第一个样式模板:
<Style TargetType="myStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="myStyle">
<telerik:RadGridView Name="SomeName"
ItemsSource="{TemplateBinding SomeSource}"
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding SomeBinding}" Header="SomeHeader"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding SomeBinding2}" Header="SomeHeader2" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding SomeBinding3}" Header="SomeHeader3" IsReadOnly="True">
<telerik:GridViewDataColumn.CellTemplate>
<DataTemplate>
<Controls DataContext="{Binding SomeBinding4}" />
</DataTemplate>
</telerik:GridViewDataColumn.CellTemplate>
</telerik:GridViewDataColumn>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
和 xaml 将使用它的文件:
<myStyle
Grid.Row="0"
SomeSource="{Binding SomeExternalSource}">
<!-- I want here behaviour that will interact with myStyle Columns for example exporting this data to excel-->
</myStyle>
当您创建自定义 Controls
或 Views
并且您希望它们具有一些(技术)界面,以便您可以使用 xaml 标记或代码与您的自定义类型进行交互, 我建议你加上 public DependencyProperties
.
假设您有一个控件 MySpecialGrid
public class MySpecialGrid : Control
{
ctor() {
DefaultStyleKey = typeof(MySpecialGrid);
Columns = new RadGridViewColumnsConfiguration();
}
public RadGridViewColumnsConfiguration Columns
{
get { return (RadGridViewColumnsConfiguration) GetValue( ColumnsProperty ); }
set { SetValue( ColumnsProperty, value ); }
}
public static readonly DependencyProperty ColumnsProperty =
DependencyProperty.Register( "Columns", typeof( RadGridViewColumnsConfiguration),
typeof( MySpecialGrid), null );
}
MySpecialGrid
的默认样式<Style TargetType="MySpecialGrid">
<Setter Property="Columns">
<Setter.Value>
<RadGridViewColumnsConfiguration>
<GridViewDataColumn DataMemberBinding="{Binding SomeBinding}" Header="SomeHeader"/>
<GridViewDataColumn DataMemberBinding="{Binding SomeBinding2}" Header="SomeHeader2"/>
<GridViewDataColumn DataMemberBinding="{Binding SomeBinding3}" Header="SomeHeader3">
<GridViewDataColumn.CellTemplate>
<DataTemplate>
<... />
</DataTemplate>
</GridViewDataColumn.CellTemplate>
</GridViewDataColumn>
</RadGridViewColumnsConfiguration>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MySpecialGrid">
<RadGridView Columns="{TemplateBinding Columns}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
您现在可以像这样从控件外部访问它:
<MySpecialGrid x:Name="FeeblefezerDataGrid" ... />
<MyExcelExportButton Content="Export To Excel"
ColumnsConfiguration="{Binding ElementName=FeeblefezerDataGrid, Path=Columns}"/>