WPF Binding FallbackValue установлен на привязку
Есть ли способ иметь другое связывание в качестве резервного значения?
Я пытаюсь сделать что-то вроде этого:
<Label Content="{Binding SelectedItem.Name, ElementName=groupTreeView,
FallbackValue={Binding RootGroup.Name}}" />
Если кто-то получил еще один трюк, чтобы снять его, это было бы здорово.
Ответы
Ответ 1
То, что вы ищете, называется PriorityBinding (# 6 на этот список)
(из статьи)
Пункт PriorityBinding - это назовите несколько привязок данных в порядке наиболее желательного для наименее желательного. Таким образом, если первое скрепление не выполняется, пуст и/или по умолчанию, другой привязка может занять место.
например.
<TextBox>
<TextBox.Text>
<PriorityBinding>
<Binding Path="LastNameNonExistant" IsAsync="True" />
<Binding Path="FirstName" IsAsync="True" />
</PriorityBinding>
</TextBox.Text>
</TextBox>
Ответ 2
В каких условиях вы хотели бы использовать значение Fallback? Как бы вы определили, что привязка не удалась? Связывание все еще действует, даже если оно связано с нулевым значением.
Я думаю, что хорошей ставкой может быть использование конвертера для преобразования в значение по умолчанию, если привязка возвращает null. Я не уверен, как вы могли бы по умолчанию использовать другое значение.
Ознакомьтесь с преобразователями здесь
Ответ 3
Если у вас возникли проблемы с привязкой к нулевым значениям и PriorityBinding (как указал Shimmy), вы можете пойти с MultiBinding и MultiValueConverter следующим образом:
public class PriorityMultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.FirstOrDefault(o => o != null);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Использование:
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource PriorityMultiValueConverter}">
<Binding Path="LastNameNull" />
<Binding Path="FirstName" />
</MultiBinding>
</TextBox.Text>
</TextBox>