Подтвердить что ты не робот

WPF Binding FallbackValue установлен на привязку

Есть ли способ иметь другое связывание в качестве резервного значения?

Я пытаюсь сделать что-то вроде этого:

<Label Content="{Binding SelectedItem.Name, ElementName=groupTreeView,
                         FallbackValue={Binding RootGroup.Name}}" />

Если кто-то получил еще один трюк, чтобы снять его, это было бы здорово.

4b9b3361

Ответ 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>