使模板视图对外部参数可见

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>

当您创建自定义 ControlsViews 并且您希望它们具有一些(技术)界面,以便您可以使用 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}"/>