2013-10-04 21 views
0

是否有可能将一个或多个控件建立在资源中定义的控件上。以便控件继承基本控件的大多数属性。类似风格的方法,但由于某种原因,我不能使用事件/ EventSetter(在这种情况下AutoGeneratingColumns),我得到的错误是“xy事件不是路由事件”资源控制上的基本XAML控件

这里是我想要完成的一个例子。 我有DataGrid中,大部分的属性是相同的

<DataGrid x:Name="gridEditSystem" 
      AutoGeneratingColumn="onGridEditSystem_autoGeneratingColumn" 
      SelectionUnit="Cell" 
      SelectionMode="Single" CellStyle="{StaticResource GridEditStyle}"> 
</DataGrid> 

<DataGrid x:Name="gridEditPlanets" SelectedCellsChanged="gridEditPlanets_SelectedCellsChanged" 
      AutoGeneratingColumn="onGridEditSystem_autoGeneratingColumn" 
      SelectionUnit="Cell" 
      SelectionMode="Single" CellStyle="{StaticResource GridEditStyle}"> 
</DataGrid> 

我现在要的是“基本控制”

<Window.Resources> 
    <DataGrid x:Key="BaseDataGrid" AutoGeneratingColumn="onGridEditSystem_autoGeneratingColumn" 
       SelectionMode="Single" SelectionUnit="Cell" 
       CellStyle="{StaticResource GridEditStyle}"> 
    </DataGrid> 
</Window.Resources> 

,传承控件

<DataGrid x:Name="gridEditSystem" 
      BasedOn/Inherits/Templates={StaticResource BaseDataGrid} 
</DataGrid> 

<DataGrid x:Name="gridEditPlanets" 
      BasedOn/Inherits/Templates={StaticResource BaseDataGrid} 
</DataGrid> 

我试过几个但迄今为止失败了,我也没有在Google上找到任何东西。这在XAML中可能吗?

回答

0

你不能那样做,但是在WPF中,你可以通过很多方式来实现。

您可以使用所有常见属性制作自定义网格控件,并使用它来代替常规的DataGrid控件。

public class BaseDataGrid : DataGrid 
    { 
     protected override void OnInitialized(EventArgs e) 
     { 
      base.OnInitialized(e); 

      // Set all you common properties here 
      SelectionUnit = DataGridSelectionUnit.Cell; 
      SelectionMode = DataGridSelectionMode.Single; 
      CellStyle = FindResource("GridEditStyle") as Style; 
     } 
    } 

在XAML

 <local:BaseDataGrid x:Name="gridEditSystem"/> 
     <local:BaseDataGrid x:Name="gridEditPlanets"/> 

您也可以与您的所有常见特性behavoir并将其连接到您想要的DataGrid秒。

 public class BaseGridBehavior : Behavior<DataGrid> 
    { 
     protected override void OnAttached() 
     { 
      AssociatedObject.Initialized += AssociatedObject_Initialized; 

      base.OnAttached(); 
     } 

     void AssociatedObject_Initialized(object sender, EventArgs e) 
     { 
      // Set all you common properties here 
      AssociatedObject.SelectionUnit = DataGridSelectionUnit.Cell; 
      AssociatedObject.SelectionMode = DataGridSelectionMode.Single; 
      AssociatedObject.CellStyle = AssociatedObject.FindResource("GridEditStyle") as Style; 
     } 
    } 

,并在XAML:

 <DataGrid x:Name="gridEditSystem"> 
      <i:Interaction.Behaviors> 
       <local:BaseGridBehavior/> 
      </i:Interaction.Behaviors> 
     </DataGrid> 
     <DataGrid x:Name="gridEditPlanets"> 
      <i:Interaction.Behaviors> 
       <local:BaseGridBehavior/> 
      </i:Interaction.Behaviors> 
     </DataGrid> 

这将需要可以包括和引用System.Windows.Interactivity DLL

希望这有助于

+0

谢谢。我已经想到了一个基础班,但不太喜欢这个想法。用行为做它对我来说是新的。看起来我会解决基础班。 – Kirschi