2017-11-27 10 views
1

私はC#で自分の拳UserControlを作ろうとしています。これは、生活の質を改善したTabControllです。目標はさまざまなプロジェクトでそれを使用できるようにするため、可能な限り汎用的でなければなりません。UserControls ContentTemplateを公開する

これまでは、DependencyPropertyを通じてItemSourceを公開してきました。しかし、私はContentTemplateプロパティで同じことをする方法を吸う。

ここでは、これまでに私のコードの例です:

XAML:背後

<UserControl ...> 
    <UserControl.Resources> 
     <!-- some styles and templates --> 
    </UserControl.Resources> 
    <TabControl ItemsSource="{Binding ItemsSource}" SelectedIndex="{Binding selectedIndex}" 
      Style="{StaticResource FixatedTabControl}" ItemTemplateSelector="{StaticResource myDataTemplateSelector}"/> 
</UserControl> 

コード:

public partial class DynamicTabControl : UserControl, INotifyPropertyChanged 
{ 
    public DynamicTabControl() 
     { 
      InitializeComponent(); 
      this.DataContext = this; 
     } 

     public static readonly DependencyProperty ItemsSourceProperty = 
      DependencyProperty.Register("ItemsSource", typeof(IEnumerable<ITabItem>), typeof(DynamicTabControl)); 
     public IEnumerable<ITabItem> ItemsSource 
     { 
      get { return (IEnumerable<ITabItem>)GetValue(ItemsSourceProperty); } 
      set { SetValue(ItemsSourceProperty, value); } 
     } 
} 

私はそうのようなDynamicTabControlを使用することができます。

<Window x:Class="Demo.MainWindow" 
     ...    
     xmlns:local="clr-namespace:Demo" 
     xmlns:foo="clr-namespace:DynamicTabUserControl" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <foo:DynamicTabControl x:Name="testTabContr" ItemsSource="{Binding data}"> 

     </foo:DynamicTabControl> 
    </Grid> 
</Window> 

しかし、私はそれを可能にすることができます変更/追加のcontContemplateのTabControlの? 私はそのようなように振る舞うために取得したいと思い:私はまだ学んでいる

<Window x:Class="Demo.MainWindow" 
      ...    
      xmlns:local="clr-namespace:Demo" 
      xmlns:foo="clr-namespace:DynamicTabUserControl" 
      mc:Ignorable="d" 
      Title="MainWindow" Height="350" Width="525"> 
     <Grid> 
      <foo:DynamicTabControl x:Name="testTabContr" ItemsSource="{Binding data}"> 
       <foo:DynamicTabControl.TabControl.ContentTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding someData}"/> 
        </DataTemplate> 
       </foo:DynamicTabControl.TabControl.ContentTemplate> 
      </foo:DynamicTabControl> 
     </Grid> 
    </Window> 

ので、私を助けてください。 ありがとうございます。

+0

外部から完全なテンプレートをカスタマイズするには、カスタムコントロール( 'UserControl'ではなく)を使用する必要があります。テンプレートが内部のいくつかの要素のテンプレートであれば、既に行ったように - 依存関係プロパティを介して公開し、変更を監視し、対応する要素に設定します。 – Sinatr

答えて

0

UserControlに別の依存関係プロパティを追加します。

public partial class DynamicTabControl : UserControl, INotifyPropertyChanged 
{ 
    public DynamicTabControl() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty ItemsSourceProperty = 
     DependencyProperty.Register("ItemsSource", typeof(IEnumerable<ITabItem>), typeof(DynamicTabControl)); 
    public IEnumerable<ITabItem> ItemsSource 
    { 
     get { return (IEnumerable<ITabItem>)GetValue(ItemsSourceProperty); } 
     set { SetValue(ItemsSourceProperty, value); } 
    } 

    public static readonly DependencyProperty TabContentTemplateProperty = 
     DependencyProperty.Register("TabContentTemplate", typeof(DataTemplate), typeof(DynamicTabControl)); 

    public DataTemplate TabContentTemplate 
    { 
     get { return (DataTemplate)GetValue(TabContentTemplateProperty); } 
     set { SetValue(TabContentTemplateProperty, value); } 
    } 
} 

を...そしてそれにバインド:

<UserControl> 
    <UserControl.Resources> 
     <!-- some styles and templates --> 
    </UserControl.Resources> 
    <TabControl ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource AncestorType=UserControl}}" 
       Style="{StaticResource FixatedTabControl}" 
       ContentTemplate="{Binding TabContentTemplate, RelativeSource={RelativeSource AncestorType=UserControl}}"/> 
</UserControl> 

あなたは、ウィンドウのXAMLマークアップでこのプロパティを設定することができます。

<foo:DynamicTabControl x:Name="testTabContr" ItemsSource="{Binding data}"> 
    <foo:DynamicTabControl.TabContentTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding someData}"/> 
     </DataTemplate> 
    </foo:DynamicTabControl.TabContentTemplate> 
</foo:DynamicTabControl> 
関連する問題