ОК, я действительно не понимаю, что здесь не так ...: 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à! Заранее спасибо!