Значение FallbackValue привязки WPF для привязки

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

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

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

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

3 ответов


то, что вы ищете, называется PriorityBinding (#6 on этой список)

(из статьи)

точка PriorityBinding-это имя нескольких Привязок данных по порядку из самых желанных к наименее желанным. Таким образом, если первая привязка не, пусто и / или по умолчанию, другое привязка может занять его место.

например

<TextBox>
    <TextBox.Text>
        <PriorityBinding>
            <Binding Path="LastNameNonExistant" IsAsync="True" />
            <Binding Path="FirstName" IsAsync="True" />
        </PriorityBinding>
    </TextBox.Text>
</TextBox>

при каких условиях вы хотите использовать резервное значение? Как бы вы определили, что привязка не удалась? Привязка по-прежнему действительна, даже если она привязана к нулевому значению.

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

проверить конвертеры здесь


Если у вас возникли проблемы с привязкой к нулевым значениям и PriorityBinding (как указал Шимми) , вы можете пойти с 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>