2009-03-30 7 views
1

私はそのようなタスクを持っています - ユニオン2つのコントロール(WPFToolkitと標準ツールバーからのDataGrid)のコントロールを作成する。大規模では、それがどのようにユニオンを制御するかは問題ではありません。私は必要なものを構築するために使用できる共通のプラクティスを見つけ出す必要があります。一見すると、ユーザーコントロール、つまりコントロールの構成のようなものが必要です。これは、私が全体として実装して再利用できるようにするためです。しかし、私の仕事では、XAMLでコンポジットコントロールを調整する必要があります。ですから、ツールバーとDataGridを作成すると、両方のプロパティとイベントが公開されます。だから私は、例えば、両方のXAMLで設定することができ、データグリッドの列とツールバーのバー:カスタム/ユーザコントロール

(loacalパーサが何らかの理由のためにそれらを入力していなかったので、私は、意図的にタグ名にスペースを入れる)

<MyDataGridToolBarControl> 
<DataGrid> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="firstColumn"> 
      </DataGridTextColumn> 
      <DataGridTextColumn Header="secondColumn"/> 
     </DataGrid.Columns> 
</DataGrid> 
<ToolBar Background="{x:Null}"> 
     <Button ToolTip="New"> 
      <Image Source="New.png"/> 
     </Button> 
     <Button ToolTip="Save"> 
      <Image Source="Save.png"/> 
     </Button> 
     <Button ToolTip="Delete"> 
      <Image Source="Delete.png"/> 
     </Button>    
</ToolBar> 
</MyDataGridToolBarControl> 

DataGridはDataGridから継承されたカスタムコントロールを作成し、DataGridとツールバーの両方を含むTemplateを再定義するだけです。これは私にDataGridのすべての力を与えてくれますが、私がToolbarを手に入れたいのであれば、私はコードを使ってそれを実行し、バイラルで論理的なツリーでそれを探す必要があります。 事前にお礼します...

答えて

1

グリッドのすべてのプロパティとツールバーのすべてのプロパティにXaml経由でアクセスしたい場合は、このように2つのコントロールを、ユーザーコントロールを作成し、公開することができます:

<UserControl> 

    <StackPanel> 
     <ToolBar x:Name="ToolBar" x:FieldModifier="Public" /> 
     <DataGrid x:Name="Grid" x:FieldModifier="Public" />   
    </StackPanel> 

<UserControl> 

このアプローチの問題は、それがユーザーコントロールであるため、ユーザーがグリッドやツールバーのレイアウトを上書きすることができないということです。ただし、ツールバーとグリッドのテンプレートとスタイルを完全にオーバーライドできます。

やや良い方法は、カスタムコントロールを作成することです(やはりコンポジションを使用して)。テンプレートのグリッドとツールバーは、次のように入力することができます:

<ControlTemplate> 
     <StackPanel> 
      <ToolBar x:Name="PART_ToolBar" /> 
      <DataGrid x:Name="PART_Grid" />   
     </StackPanel> 
</ControlTemplate> 

[TemplatePart("PART_ToolBar", typeof(ToolBar))] 
[TemplatePart("PART_Grid", typeof(DataGrid))] 
public class MyCustomControl : Control 
{ 
    private ToolBar _ToolBar; 
    public ToolBar ToolBar {get{return _ToolBar;}} 

    private DataGrid _Grid; 
    public DataGrid Grid {get{return _Grid;}} 

    protected overrides OnApplyTemplate() 
    { 
     _ToolBar = this.Template.FindName("PART_ToolBar", this) as ToolBar; 
     _Grid = this.Template.FindName("PART_Grid", this) as DataGrid; 
    } 
} 
+0

私はこのアプローチを実装しようとしています。イベントについて?この方法でネイティブのツールバーとグリッドを処理することは可能ですか? –

+0

GridまたはToolBarが外部に公開されている限り(どちらの場合でも)、直接インスタンス化したかのように、必要なすべてを実行できます。もちろん、これによってカプセル化が破られ、消費者がコントロールに何らかの不具合を引き起こした場合には、問題が発生する可能性があります。 – Micah

+0

私はあなたに電子メールでサンプルプロジェクトを送信できますか?そのようなデータグリッドは双方向で実装されています。カスタムxamlスタイルを使用したDataGridのプロパティあなたはとてもうれしいですか? XAML –