web-dev-qa-db-ja.com

WPFバインディングFallbackValueをBindingに設定

フォールバック値として別のバインディングを持つ方法はありますか?

私はこのようなことをしようとしています:

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

誰かがそれをやってのけるための別のトリックを持っているなら、それは素晴らしいことです。

36
HaxElit

あなたが探しているのはPriorityBindingと呼ばれるものです( this リストの#6)

(記事から)

PriorityBindingのポイントは、複数のデータバインディングに、最も望ましいものから最も望ましくないものの順に名前を付けることです。このようにして、最初のバインディングが失敗した場合、空であるかデフォルトである場合、別のバインディングが代わりに使用できます。

例えば.

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

Null値と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>
4
Sven

どのような条件下でフォールバック値を使用しますか?バインディングが失敗したとどのように判断しますか?バインディングは、null値にバインドされている場合でも有効です。

バインディングがnullを返した場合は、コンバーターを使用してデフォルト値に変換することをお勧めします。ただし、デフォルトで別のバインド値を設定する方法はわかりません。

チェックアウト ここのコンバーター

3
James Hay