Multibinding ищет ошибку источника отсутствующего предка: простой совет?

Допустим, у меня есть UserControl, как это:

<UserControl 
    x:Class="SandBox.IconUC" 
    xmlns:sb="clr-namespace:SandBox" 
    x:Name="Icon_Control" ...>

    <UserControl.Resources>
        <sb:IconActualScalingConverter x:Key="IconActualScaling_Converter" />
    </UserControl.Resources>

    <!-- ... -->
        <ScaleTransform.ScaleX>
            <MultiBinding Converter="{StaticResource IconActualScaling_Converter}">
                <Binding Path="BaseSize" ElementName="Icon_Control" />
                <Binding 
                    Path="ScalingOverride" 
                    RelativeSource="{RelativeSource AncestorType=sb:ContainerUC}" />
            </MultiBinding>
        </ScaleTransform.ScaleX>
    <!-- ... -->
</UserControl>

Очевидно, я хочу масштабировать его содержимое на основе собственного свойства зависимости, называемого BaseSize и свойство зависимостей контейнера UserControl где-то в пути через этого предка IconUC типа ContainerUC,

Это работает очень хорошо, когда я установил IconUC как потомка одного ContainerUC.

К сожалению, когда я помещаю Icon в другой элемент управления, например, в StackPanel, у которого в качестве предка нет NO ContainerUC, я получаю следующее предупреждение:

Предупреждение System.Windows.Data: 4:
Не удается найти источник для привязки со ссылкой
'RelativeSource FindAncestor, AncestorType =' SandBox.ContainerUC ', AncestorLevel =' 1 ''.
BindingExpression: Path = ScalingOverride; DataItem = NULL;
целевой элемент - "ScaleTransform" (HashCode=51921052);
целевое свойство 'ScaleX' (тип 'Double')

И это нормально.

Как просто предотвратить это предупреждение, например игнорировать привязку, если не удалось разрешить путь к источнику?

То, что я хотел бы, это не обходной путь:

  1. Использование DependencyProperty.RegisterAttached на ContainerUC и получение значения метаданных по умолчанию в IconUC, если не был найден Ancestor. Я знаю, что это хороший обходной путь.
  2. Использование (тяжелого) кода для получения желаемого Предка или использование значения по умолчанию. Это также работает, и мне даже не нужен конвертер для этого.
  3. Помещение StackPanel внутри контейнера. StackPanel предназначен для проверки размеров значков. В любом случае, иконки на самом деле являются гораздо более сложными объектами, которые могут приземлиться в нескольких типах контейнеров, а не только в этом контейнере.

Я хотел бы просто узнать, существует ли один способ избежать ошибок, даже если требуемый предок отсутствует в MultiBindings.

Пытался FallbackValue="1.0" в обязательном порядке. Все еще получаю предупреждение.
Пытался TargetNullValue="1.0", Все еще получаю предупреждение.
Пытался UpdateSourceExceptionFilter="SomeMethod", Все еще получаю предупреждение.
Пытался NotifyOnValidationError="False", Все еще получаю предупреждение.

Если ответ " Нет", ваш IconUC UserControl обречен быть потомком ContainerUC в этом случае, тогда я буду в порядке с этим.:)


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

public class IconActualScalingConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double definedScaling = (double)values[0];
        double scalingFactor = 1.0;

        if (values.Length > 1)
        {
            if (values[1] != DependencyProperty.UnsetValue)
            {
                scalingFactor = (double)values[1];
            }
        }
        return definedScaling * scalingFactor;
    }

    public object[] ConvertBack(...)
    {
        throw new NotImplementedException();
    }
}

Благодарю.

0 ответов

Другие вопросы по тегам