2017-02-06 16 views
0

次のコードをXAMLではなくコードにコピーするにはどうすればよいですか?カスタムコントロールのComboBox ItemSource/SelectedValueの設定

<ComboBox Name="DisplayValueComboBox" Grid.Column="1" ItemsSource="{Binding Source={wpfUtil:EnumBindingSource {x:Type unitTypes:FeetOrMetersSelectionType}}}" SelectedValue="{Binding Path=DisplayValueType}"></ComboBox> 

一般的なカスタムユーザーコントロールを作成しようとしています。これを行うには、私はすべてのコードでそれを行う必要があります。私のカスタムコントロールは、単にテキストボックスとコンボボックスです。コンボボックスには、列挙型の項目(genericで指定)が含まれている必要があります。項目は、表示する単位のリスト(フィート/メートル、度/ラジアンなど)になります。ユーザーが単位を変更すると、(MultiValueConverterを使用して)テキストボックスの値が変換されます。hereの方法でXAMLを介してコンボ列挙バインディングを実行しました。そして、私はフィート/メーターユニットコントロール用のジェネリックスを使わずにコントロールを操作しています。しかし、今では、ジェネリックのコンストラクタ内でItemSourceとSelectedValueを設定する方法については分かりません。

/// <summary> 
/// Control that displays value in different units depending on selected unit type. 
/// </summary> 
/// <typeparam name="TDisplayTypeEnum">The enumeration type for all the available units.</typeparam> 
/// <typeparam name="TConverterType">The MultiValueConverter that converts the value between the different types of units.</typeparam> 
/// <typeparam name="TValueType">The underlying type of the stored value.</typeparam> 
public class UnitControlBase<TDisplayTypeEnum, TConverterType, TValueType> : UserControl 
    where TDisplayTypeEnum : struct, IConvertible 
    where TConverterType : IMultiValueConverter, new() 
{ 
    /// <summary> 
    /// Constructor. 
    /// </summary> 
    public UnitControlBase() 
    { 
     Grid mainGrid = new Grid(); 
     mainGrid.Name = "LayoutRoot"; 
     this.AddChild(mainGrid); 

     ColumnDefinition col1 = new ColumnDefinition(); 
     ColumnDefinition col2 = new ColumnDefinition(); 
     mainGrid.ColumnDefinitions.Add(col1); 
     mainGrid.ColumnDefinitions.Add(col2); 

     TextBox displayValueTextBox = new TextBox(); 
     displayValueTextBox.Name = "DisplayValueTextBox"; 
     MultiBinding mb = new MultiBinding(); 
     mb.Converter = new TConverterType(); 
     mb.Bindings.Add(new Binding("Value")); 
     mb.Bindings.Add(new Binding("ValueType")); 
     mb.Bindings.Add(new Binding("DisplayValueType")); 
     displayValueTextBox.SetBinding(TextBox.TextProperty, mb); 
     Grid.SetColumn(displayValueTextBox, 0); 
     mainGrid.Children.Add(displayValueTextBox); 

     ComboBox displayValueComboBox = new ComboBox(); 
     displayValueComboBox.Name = "DisplayValueComboBox";    
     //displayValueComboBox.ItemsSource = ??? 
     //displayValueComboBox.SelectedValue = ??? 
     Grid.SetColumn(displayValueComboBox, 1); 
     mainGrid.Children.Add(displayValueComboBox);    
    } 

    private static FrameworkPropertyMetadata valuePropertyMetadata = new FrameworkPropertyMetadata(default(TValueType)); 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(TValueType), typeof(UnitControlBase<TDisplayTypeEnum, TConverterType, TValueType>), valuePropertyMetadata); 

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

    private static FrameworkPropertyMetadata valueTypePropertyMetadata = new FrameworkPropertyMetadata(default(TDisplayTypeEnum)); 

    public static readonly DependencyProperty ValueTypeProperty = 
     DependencyProperty.Register("ValueType", typeof(TDisplayTypeEnum), typeof(UnitControlBase<TDisplayTypeEnum, TConverterType, TValueType>), valueTypePropertyMetadata); 

    public TDisplayTypeEnum ValueType 
    { 
     get 
     { 
      return (TDisplayTypeEnum)GetValue(ValueTypeProperty); 
     } 
     set 
     { 
      SetValue(ValueProperty, value); 
     } 
    } 

    private static FrameworkPropertyMetadata displayValueTypePropertyMetadata = new FrameworkPropertyMetadata(default(TDisplayTypeEnum)); 

    public static readonly DependencyProperty DisplayValueTypeProperty = 
     DependencyProperty.Register("DisplayValueType", typeof(TDisplayTypeEnum), typeof(UnitControlBase<TDisplayTypeEnum, TConverterType, TValueType>), displayValueTypePropertyMetadata); 

    public TDisplayTypeEnum DisplayValueType 
    { 
     get 
     { 
      return (TDisplayTypeEnum)GetValue(DisplayValueTypeProperty); 
     } 
     set 
     { 
      SetValue(DisplayValueTypeProperty, value); 
     } 
    } 
} 

子供クラス:

public class FeetMetersControlBase : UnitControlBase<FeetOrMetersSelectionType, FeetToMetersMultiValueConverter, double> 
{ 
} 

フィート/メートルタイプ:

public enum FeetOrMetersSelectionType 
{ 
    Feet, 
    Meters 
} 

答えて

1

てみてくださいそれが助け場合は、以下の

は、一般的なベースの休息と子クラスでありますこれは:

displayValueComboBox.ItemsSource = Enum.GetValues(typeof(TDisplayTypeEnum)); 
displayValueComboBox.SetBinding(ComboBox.SelectedItemProperty, new Binding("DisplayValueType") { Source = this }); 
+0

それがうまくいった。列挙型の値を直接取得することさえ私には及ばなかった。私はXAMLのために作成しなければならないものを使用しようとしていました。 – bsh152s

関連する問題