Как я могу дублировать следующий код в коде (а не XAML)?Настройка ComboBox ItemSource/SelectedValue в настраиваемом элементе управления
<ComboBox Name="DisplayValueComboBox" Grid.Column="1" ItemsSource="{Binding Source={wpfUtil:EnumBindingSource {x:Type unitTypes:FeetOrMetersSelectionType}}}" SelectedValue="{Binding Path=DisplayValueType}"></ComboBox>
Я пытаюсь создать пользовательский элемент управления, который является общим. Чтобы сделать это, я должен сделать это во всем коде. Мой пользовательский элемент управления - это просто текстовое поле и поле со списком. Поле со списком должно содержать элементы внутри перечисления (указанные в общем виде). Элементами будут список отображаемых единиц (футы/метры, градусы/радианы и т. Д.). Если пользователь меняет единицы измерения, значение в текстовом поле будет преобразовано (с использованием MultiValueConverter), я выполнил привязку combo enum через XAML с помощью метода, описанного here. И у меня есть контроль, который работает без единого элемента для управления единицей футов/метров. Но теперь я теряюсь относительно того, как установить 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>
{
}
Feet/Meters Тип:
public enum FeetOrMetersSelectionType
{
Feet,
Meters
}
Это сработало. Мне даже не приходило, чтобы получить значения перечисления напрямую. Я пытался использовать материал, который я должен был создать для XAML. – bsh152s