WPF: свойство PriorityBinding для источника изображения не переключается на следующую строку в UnsetValue - PullRequest
0 голосов
/ 10 апреля 2020

ОК, я действительно не понимаю, что здесь не так ...: o (

Я надеюсь, что кто-нибудь знает, что я делаю неправильно.

У меня есть PriorityBinding, который просто отказывается переходить к следующему элементу: у меня есть элемент управления Image, который использует PriorityBinding, чтобы сначала показать указанное изображение Image, и он должен перейти на DefaultImage, если изображение не установлено. с этой целью я попытался использовать DependencyProperty.UnsetValue, как указано в документации, для обработки случаев, когда изображение не установлено или отсутствует / существует.

Но установка UnsetValue ничего не делает: контейнер Image ничего не отображает вместо отображения DefaultImage. Это не проблема с DefaultImage, поскольку при изменении порядка привязок будет показано изображение по умолчанию.

#region DepProp: DefaultImage

public static readonly DependencyProperty DefaultImageProperty = DependencyProperty.Register("DefaultImage", typeof(ImageSource), typeof(vokImage), new PropertyMetadata(null));

public ImageSource DefaultImage
{
    get => (ImageSource)this.GetValue(DefaultImageProperty);
    set => this.SetValue(DefaultImageProperty, value);
}

#endregion

#region DepProp: Image

public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("Image", typeof(ImageSource), typeof(vokImage), new PropertyMetadata(null, null, CoerceImage));

public ImageSource Image
{
    get => (ImageSource)this.GetValue(ImageProperty);
    set => this.SetValue(ImageProperty, value);
}

/// <summary>
/// Ensure than we have an image else unset property to display default image
/// </summary>
private static object CoerceImage(DependencyObject d, object value)
{
    return DependencyProperty.UnsetValue;
    //return ((ImageSource)value)?.ToString() == null ? DependencyProperty.UnsetValue : value;
}

#endregion

И в XAML:

<!-- Image to display -->
<Image x:Name               = "Image"
       Height               = "{Binding Height, RelativeSource={RelativeSource AncestorType=ccont:vokImage}}"
       Width                = "{Binding Width,  RelativeSource={RelativeSource AncestorType=ccont:vokImage}}"
       HorizontalAlignment  = "Center"
       VerticalAlignment    = "Center"
       Visibility           = "Visible"
       Opacity              = "1">

    <Image.Source>
        <PriorityBinding>
            <Binding Path="Image"           RelativeSource="{RelativeSource AncestorType=ccont:vokImage}" />
            <Binding Path="DefaultImage"    RelativeSource="{RelativeSource AncestorType=ccont:vokImage}" />
        </PriorityBinding>
    </Image.Source>

</Image>

Когда Image установлен на DependencyProperty.UnsetValue, я бы ожидал, что PriorityBinding перейдет на DefaultImage, но этого просто не происходит при использовании DependencyProperty, который является ImageSource.

Отработка отказа работает, только если, например, я использую тот же код, но для TextBlock и привязки к Width p roperty, например:

<!-- Test with a TextBox: WORKS!!! -->
<TextBlock>

    <TextBlock.Text>
        <PriorityBinding>
            <Binding Path="Image.Width"           RelativeSource="{RelativeSource AncestorType=ccont:vokImage}" />
            <Binding Path="DefaultImage.Width"    RelativeSource="{RelativeSource AncestorType=ccont:vokImage}" />
        </PriorityBinding>
    </TextBlock.Text>

</TextBlock>

Похоже, что UnsetValue вообще не рассматривается как сбойная привязка, а привязка TextBox переносится только на следующую, потому что UnsetValue не имеет отсутствия член Width ...

Это как-то противоречит спецификации для PriorityBinding.

https://docs.microsoft.com/en-us/dotnet/api/system.windows.data.prioritybinding?view=netcore-3.1

Если я закомментирую первый Привязка резервного изображения DefaultImage отображается правильно, поэтому он доказывает, что UnsetValue не сбрасывает первую привязку, следовательно, первое ImageSource, которое недопустимо, применяется к Image, и это Image как имеющее недопустимое ImageSource не отображается ...

Кодирование. NET Core 3.1 BTW ...

Voilà! Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...