2017-11-07 30 views
0

誰かがこのような作業を手伝ってくれますか?私は、リソーステンプレートを持っており、それにWPFをControlTemplateに渡すパラメータ

<ControlTemplate x:Key="PlanAssetValue" TargetType="ContentControl"> 
    <ContentControl Template="{StaticResource Period}"> 
     <StackPanel Height="Auto" Width="Auto" x:Name="MainPanel"> 
      <DockPanel 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Top" 
       Height="Auto" 
       Margin="10"> 
       <TextBlock Text="{Binding Path=Paramprompt[IsMarket]}" DockPanel.Dock="Left" Width="160" Margin="0,2,0,0"/> 
       <ComboBox DockPanel.Dock="Left" Margin="5,0,0,0" Width="Auto" 
           ItemsSource="{Binding Path=ParamDetails[IsMarket]}" 
           DisplayMemberPath="Name" 
           VerticalAlignment="Top" 
           StaysOpenOnEdit="True" 
           SelectedValue="{Binding Path=ParamValues[IsMarket]}" SelectedValuePath="Code"> 
       </ComboBox> 
      </DockPanel> 
      <DockPanel 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Top" 
       Height="Auto" 
       Margin="10"> 
       <TextBlock Text="{Binding Path=Paramprompt[Currency]}" DockPanel.Dock="Left" Width="160" Margin="0,2,0,0"/> 
       <ComboBox DockPanel.Dock="Left" Margin="5,0,0,0" Width="Auto" 
           ItemsSource="{Binding Path=ParamDetails[Currency]}" 
           DisplayMemberPath="Name" 
           VerticalAlignment="Top" 
           StaysOpenOnEdit="True" 
           SelectedValue="{Binding Path=ParamValues[Currency]}" SelectedValuePath="Code"> 
       </ComboBox> 
      </DockPanel> 
     </StackPanel> 
    </ContentControl> 
</ControlTemplate> 

を重複コードの量を減少しようとしている私は、フィールドの代わりに設定したパラメータをテンプレートとして、いくつかのテキストを宣言したいIsMarket

<ControlTemplate x:Key="ParamCombobox" TargetType="ContentControl"> 
      <DockPanel 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Top" 
       Height="Auto" 
       Margin="10"> 
       <TextBlock Text="{Binding Path=Paramprompt[IsMarket]}" DockPanel.Dock="Left" Width="160" Margin="0,2,0,0"/> 
       <ComboBox DockPanel.Dock="Left" Margin="5,0,0,0" Width="Auto" 
           ItemsSource="{Binding Path=ParamDetails[IsMarket]}" 
           DisplayMemberPath="Name" 
           VerticalAlignment="Top" 
           StaysOpenOnEdit="True" 
           SelectedValue="{Binding Path=ParamValues[IsMarket]}" SelectedValuePath="Code"> 
       </ComboBox> 
      </DockPanel> 
</ControlTemplate> 

答えて

1

のもの3つの関連するオブジェクトをラップクラス

N.B.

:のようなものである可能性があり

<ContentControl Template="{StaticResource Period}"> 
    <StackPanel Height="Auto" Width="Auto" x:Name="MainPanel"> 
      <ContentControl DataContext="{Binding Params[IsMarket]}" 
          Template="{StaticResource ParamTemplate}" /> 
      <ContentControl DataContext="{Binding Params[Currency]}" 
          Template="{StaticResource ParamTemplate}" /> 
    </StackPanel> 
</ContentControl> 

そして、あなたの親VM:私は簡潔にするため

public class ParamViewModel : INotifyPropertyChanged 
{ 
    public string Prompt { get; set; } 
    public ObservableCollection<string> Details { get; set;} 
    public string SelectedValue { get; set; } 
} 

次に、あなたの親に正しいオブジェクトにバインドDataContextのコントロールテンプレートを持つVMをINotifyPropertyChanged実装を省略しています

public class ParentViewModel : INotifyPropertyChanged 
{ 
    public Dictionary<string, Param> Params { get; set;} 
} 


<ControlTemplate x:Key="ParamTemplate" TargetType="ContentControl"> 
      <DockPanel 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Top" 
       Height="Auto" 
       Margin="10"> 
       <TextBlock Text="{Binding Path=Prompt}" DockPanel.Dock="Left" Width="160" Margin="0,2,0,0"/> 
       <ComboBox DockPanel.Dock="Left" Margin="5,0,0,0" Width="Auto" 
           ItemsSource="{Binding Path=Details}" 
           DisplayMemberPath="Name" 
           VerticalAlignment="Top" 
           StaysOpenOnEdit="True" 
           SelectedValue="{Binding SelectedValue}" SelectedValuePath="Code"> 
       </ComboBox> 
      </DockPanel> 
</ControlTemplate> 
2

Controleロジックコントロールの表示をコントロールします。 ContentControlはその現在の1つのコンテンツを論理化します。 Contentという名前のプロパティがあり、TemplateBinding:{TemplateBinding Content}を介してテンプレート内のこの「Parameter」を使用できます。

複数の情報を表すコントロールが必要です。だからそれを作成してください!

例:

class MyUiControl : Control 
{ 
    public string Header 
    { 
     get { return (string)GetValue(HeaderProperty); } 
     set { SetValue(HeaderProperty, value); } 
    } 

    public static readonly DependencyProperty HeaderProperty = 
     DependencyProperty.Register("Header", typeof(string), typeof(MyUiControl), new PropertyMetadata(null)); 



    public IEnumerable ItemsCombo 
    { 
     get { return (IEnumerable)GetValue(ItemsComboProperty); } 
     set { SetValue(ItemsComboProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsComboProperty = 
     DependencyProperty.Register("ItemsCombo", typeof(IEnumerable), typeof(MyUiControl), new PropertyMetadata(null)); 


    public object Value 
    { 
     get { return (IEnumerable)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(object), typeof(MyUiControl), new PropertyMetadata(null)); 
} 

となりましテンプレート:

<ControlTemplate x:Key="ParamCombobox" TargetType="local:MyUiControl"> 
    <DockPanel 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Top" 
     Height="Auto" 
     Margin="10"> 
     <TextBlock Text="{TemplateBinding Header}" DockPanel.Dock="Left" Width="160" Margin="0,2,0,0"/> 
     <ComboBox DockPanel.Dock="Left" Margin="5,0,0,0" Width="Auto" 
          ItemsSource="{TemplateBinding ItemsCombo}" 
          DisplayMemberPath="Name" 
          VerticalAlignment="Top" 
          StaysOpenOnEdit="True" 
          SelectedValue="{TemplateBinding Value}" SelectedValuePath="Code"> 
     </ComboBox> 
    </DockPanel> 
</ControlTemplate> 

と制御:

<local:MyUiControl Header="{Binding paramA}" 
        ItemsCombo="{Binding paramB}" 
        Value="{Binding paramC}" /> 

しかし、あなたは本当に特別なロジックを必要としません。あなたのビジネスは、単にコントロール付きのラベルのセットです。

<Style TargetType="HeaderedContentControl"> 
    <Style.Setters> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="HeaderedContentControl"> 
        <DockPanel> 
         <TextBlock Text="{TemplateBinding Header}" DockPanel.Dock="Left" Width="160" Margin="0,2,0,0"/> 
         <ContentPresenter DockPanel.Dock="Left" Margin="5,0,0,0" Width="Auto" VerticalAlignment="Top" /> 
        </DockPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
</Style> 

制御:

<HeaderedContentControl Header="{Binding paramA}"> 
    <ComboBox ItemsSource="{Binding paramB}" 
       DisplayMemberPath="Name" 
       StaysOpenOnEdit="True" 
       SelectedValue="{Binding paramC}" SelectedValuePath="Code" /> 
</HeaderedContentControl> 
このため、私はあなたがあなたのテンプレートを使用したシンプルなHeaderedContentControlを使用することができると思います
関連する問題