WPF Ordering DataBinding во вложенных пользовательских элементах управления - PullRequest
0 голосов
/ 30 января 2019

У меня есть два пользовательских элемента управления: «Flags» и «FlagOption».«FlagOption» вложен в ItemsControl в элементе управления «Flags» следующим образом:

Элемент управления Flags:

<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>

CodeBehind:

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>();
    }
}

Элемент управления FlagOption:

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

CodeBehind:

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 привязывается свойство зависимости «Field» ПОСЛЕ свойства IsChecked, поэтому свойство Fieldnull в Получателе свойства IsChecked.Если отладить и перешагнуть через ошибку, свойство зависимостей «Поле» в конце концов становится связанным, но уже слишком поздно.

Могу ли я каким-то образом контролировать порядок привязки?Почему свойство Field Dependency Property не является обязательным до моего свойства IsChecked?

...