首页 > 解决方案 > 嵌套用户控件中的 WPF 排序数据绑定

问题描述

我有两个用户控件:“标志”和“标志选项”。'FlagOption' 嵌套在 'Flags' 控件中的 ItemsControl 中,如下所示:

标志控制:

<ItemsControl ItemsSource="Binding RelativeSource={RelativeSource AncestorType=local:Flags}, Path=FlagOptions}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:FlagOption FlagValue="{Binding}" Field="{Binding RelativeSource={RelativeSource AncestorType=local:Flags}, Path=Field}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

代码隐藏:

public static readonly DependencyProperty FieldProperty = DependencyProperty.Register(nameof(Field), typeof(TagInterface.LongFlags), typeof(Flags));

public TagInterface.LongFlags Field
{
    get { return (TagInterface.LongFlags)GetValue(FieldProperty); }
    set { SetValue(FieldProperty, value); }
}

public IEnumerable<Enum> FlagOptions
{
    get
    {
        return Enum.GetValues(Field.FieldValue.GetType()).Cast<Enum>();
    }
}

标志选项控制:

<CheckBox FlowDirection="LeftToRight" IsChecked="{Binding Path=IsChecked, RelativeSource={RelativeSource AncestorType=local:FlagOption}}"/>

代码隐藏:

public static readonly DependencyProperty FlagValueProperty = DependencyProperty.Register(nameof(FlagValue), typeof(Enum), typeof(FlagOption));
public static readonly DependencyProperty FieldProperty = DependencyProperty.Register(nameof(Field), typeof(TagInterface.LongFlags), typeof(FlagOption));

public Enum FlagValue
{
    get { return (Enum)GetValue(FlagValueProperty); }
    set { SetValue(FlagValueProperty, value); }
}

public TagInterface.LongFlags Field
{
    get { return (TagInterface.LongFlags)GetValue(FieldProperty); }
    set { SetValue(FieldProperty, value); }
}

public bool IsChecked
{
    get
    {
        // Accessing Field Property here is null because it is bound AFTER IsChecked field
        return false;
    }
    set
    {
        // TODO
    }
}

我遇到的问题是,在 FlagOption 控件中,“字段”依赖属性在 IsChecked 属性之后被绑定,因此字段属性在 IsChecked 属性的 Getter 中为空。如果调试并跳过错误,“字段”依赖属性最终会被绑定,但为时已晚。

我可以以某种方式控制绑定的顺序吗?为什么我的 IsChecked 属性之前没有绑定字段依赖属性?

标签: c#wpfdata-bindingwpf-controls

解决方案


推荐阅读