0

リソースで定義されているコントロールに基づいて 1 つ以上のコントロールを作成することは可能ですか。コントロールが基本コントロールからほとんどのプロパティを継承するようにします。スタイルのアプローチに似ていますが、何らかの理由で Events/EventSetter (AutoGeneratingColumnsこの場合) を使用できません。エラーは「xy-Event は Routed Event ではありません」です。

これが私が達成したいことの例です。ほとんどのプロパティが同じデータグリッドがあります

<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 で可能ですか?

4

1 に答える 1

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"/>

また、すべての共通プロパティを使用して動作を作成し、必要な にアタッチすることもでき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を含めて参照する必要があります。

お役に立てれば

于 2013-10-04T15:38:43.560 に答える