我想创建一个控件:
我已经设法从上面的列表中获得前三个点,但是我对第四个项目有问题。我怀疑它可能与项容器类的错误实现或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); }
}
}
项容器类型使用System.Windows.Controls.Primitives.Selector
方法覆盖与选择器控件(从IsItemItsOwnContainerOverride/GetContainerForItemOverride/PrepareContainerForItemOverride
派生)相关联。
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属性被设置(我希望这是正确的,不是吗?)。
答案 0 :(得分:1)
我认为只是在这里调用Selector.IsSelectedProperty.AddOwner
是不够的。
查看ILSpy中的ListBoxItem
代码,您可以看到在选定项和选择器本身之间进行同步可能还有其他一些事情,例如提升Selected / Unselected事件。
static ListBoxItem()
{
ListBoxItem.IsSelectedProperty = Selector.IsSelectedProperty.AddOwner(typeof(ListBoxItem), new FrameworkPropertyMetadata(BooleanBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, new PropertyChangedCallback(ListBoxItem.OnIsSelectedChanged)));
ListBoxItem.SelectedEvent = Selector.SelectedEvent.AddOwner(typeof(ListBoxItem));
ListBoxItem.UnselectedEvent = Selector.UnselectedEvent.AddOwner(typeof(ListBoxItem));
...
}
private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ListBoxItem listBoxItem = d as ListBoxItem;
bool flag = (bool)e.NewValue;
Selector parentSelector = listBoxItem.ParentSelector;
if (parentSelector != null)
{
parentSelector.RaiseIsSelectedChangedAutomationEvent(listBoxItem, flag);
}
if (flag)
{
listBoxItem.OnSelected(new RoutedEventArgs(Selector.SelectedEvent, listBoxItem));
}
else
{
listBoxItem.OnUnselected(new RoutedEventArgs(Selector.UnselectedEvent, listBoxItem));
}
listBoxItem.UpdateVisualState();
}
我自己没有尝试过,看看这是否能解决这个问题,但我认为这是一个好的开始。您还应该考虑让您的商品来自ListBoxItem
而不是ContentControl
。