【发布时间】:2012-09-10 04:37:56
【问题描述】:
我想创建一个控件:
- 派生自 ItemsControl,
- 可以绑定到枚举列表,
- 对于每个枚举,它将显示 RadioButton,
- 选择给出放射线量时,SelectedItem将包含与RadioButton关联的枚举值。
我已经成功实现了上面列表中的前三点,但第四项有问题。我怀疑它可能与项目容器类的错误实现或 generic.xaml 中的错误项目模板定义有关。
物品容器如下所示:
public class MyEnumSelectorItem : ContentControl
{
public static readonly DependencyProperty IsSelectedProperty;
static MyEnumSelectorItem()
{
IsSelectedProperty = Selector.IsSelectedProperty.AddOwner(typeof(MyEnumSelectorItem));
}
public bool IsSelected
{
get { return (bool)GetValue(IsSelectedProperty); }
set { SetValue(IsSelectedProperty, value); }
}
static readonly DependencyProperty ModeProperty =
DependencyProperty.Register("Mode", typeof(MyEnum), typeof(MyEnumSelector), new PropertyMetadata());
public MyEnum Mode
{
get { return (MyEnum)GetValue(ModeProperty); }
set { SetValue(ModeProperty, value); }
}
}
使用IsItemItsOwnContainerOverride/GetContainerForItemOverride/PrepareContainerForItemOverride 方法覆盖将项容器类型与选择器控件(派生自System.Windows.Controls.Primitives.Selector)相关联。
generic.xaml 的相关片段如下所示:
<Style TargetType="{x:Type controls:MyEnumSelector}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<RadioButton Content="{Binding}"
IsChecked="{Binding IsSelected, Mode=TwoWay}"
GroupName="enumSelector" Height="25" FontWeight="Bold" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
以上假设 IsSelected 属性的正确绑定将自动导致 SelectedItem 属性被设置(我希望这是正确的,不是吗?)。
【问题讨论】:
-
你不应该从
Selector派生吗?SelectedItem是在Selector而不是ItemsControl上定义的。 -
实际上它源自 Selector(正如我的问题后面所指出的那样)-在第一句话中,我的意思是它至少应该源自 ItemsControl。