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')
И это нормально.
Как просто предотвратить это предупреждение, например игнорировать привязку, если не удалось разрешить путь к источнику?
То, что я хотел бы, это не обходной путь:
- Использование DependencyProperty.RegisterAttached на ContainerUC и получение значения метаданных по умолчанию в IconUC, если не был найден Ancestor. Я знаю, что это хороший обходной путь.
- Использование (тяжелого) кода для получения желаемого Предка или использование значения по умолчанию. Это также работает, и мне даже не нужен конвертер для этого.
- Помещение 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();
}
}
Благодарю.