[英]WPF ComboBox, Display SelectedValue Even If Not In ItemSource
[英]Setting ComboBox ItemSource/SelectedValue in custom control
如何在代碼中復制以下代碼(非XAML)?
<ComboBox Name="DisplayValueComboBox" Grid.Column="1" ItemsSource="{Binding Source={wpfUtil:EnumBindingSource {x:Type unitTypes:FeetOrMetersSelectionType}}}" SelectedValue="{Binding Path=DisplayValueType}"></ComboBox>
我試圖創建一個通用的自定義用戶控件。 為此,我必須在所有代碼中都這樣做。 我的自定義控件只是一個文本框和一個組合框。 組合框應包含枚舉中的項目(以通用方式指定)。 這些項目將是要顯示的單位列表(英尺/米,度/弧度等)。 如果用戶更改單位,則將轉換文本框中的值(使用MultiValueConverter)。我已經通過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
}
嘗試這個:
displayValueComboBox.ItemsSource = Enum.GetValues(typeof(TDisplayTypeEnum));
displayValueComboBox.SetBinding(ComboBox.SelectedItemProperty, new Binding("DisplayValueType") { Source = this });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.