3

MultiBinding両方のBindingフィールドがtrueと評価されたかどうかに応じて、コントロールの可視性を決定するコンバーターがあります。何らかの理由でこれらのブールプロパティのいずれにも到達できない場合は、trueと評価するように設定します。例えば:

私が現在持っているコードは次のとおりです。

           <MultiBinding Converter="{StaticResource AndToVisibilityConverter1}" FallbackValue="Visible">
              <Binding Path="IsConnected" FallbackValue="true" />
              <Binding Path="CurrentUser.IsConsumerOnlyAgent" Converter="{StaticResource InvertedBooleanConverter1}" FallbackValue="True" />
           </MultiBinding>

コードは正常に実行されますが、IDEの出力に次のようなエラーメッセージが表示されます。

System.Windows.Data Error: 11 : Fallback value 'True' (type 'String') cannot be converted for use in 'Visibility' (type 'Visibility'). BindingExpression:Path=IsConnected; DataItem=null; target element is 'StackPanel' (Name=''); 

このコンバーターを特定し、XAMLエラーが発生している場所であることを確認しました。ここでの無知について申し訳ありませんが、設定されたパスの取得に失敗したときに「true」と評価するために、FallbackValueをこれらの各バインディングに設定する方法はありますか?前もって感謝します

アップデート:

これが私のVisibilityConverterのコードです(これはアプリ全体のいくつかの場所で使用していますが、フォールバック値を追加したいだけです):

   internal class AndToVisibilityConverter : IMultiValueConverter
  {
  public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  {
     if (values == null)
        return Visibility.Collapsed;

     foreach (var value in values)
     {
        if (value == null || !(value is bool))
           return Visibility.Collapsed;

        if (!((bool) value))
           return Visibility.Collapsed;
     }

     return Visibility.Visible;
  }

  public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  {
     throw new NotImplementedException();
  }
  }
4

2 に答える 2

15

FallbackValue値は、バインディングが失敗したときにフォールバックする値である必要がありますVisibility

<Binding Path="CurrentUser.IsConsumerOnlyAgent" 
    Converter="{StaticResource InvertedBooleanConverter1}" 
                FallbackValue="Visible" />

編集

FallbackValueのドキュメントから:

fallbackValue
対象のプロパティと同じ型の属性またはオブジェクト要素の値。XAML の使用法については、その型のドキュメントを参照してください。その型は、その値の属性構文をサポートしている場合とサポートしていない場合があります。また、オブジェクト要素構文 (その型の既定のコンストラクターが必要) をサポートしている場合とサポートしていない場合があります。したがって、ターゲット プロパティの型は、FallbackValue プロパティの値に使用する構文に影響します。

この場合、MultiBinding のターゲット プロパティは Visibility プロパティです。子の MultiBinding プロパティの値は bool であると想定されていますが、親の MultiBinding はバインディングからの Visiblity 値を想定しています。つまり、各 MultiBinding プロパティの FallbackValue には、Visibility プロパティの FallbackValue が必要です。

少し直感に反するように見えますが、(IMO) よく考えてみると理にかなっています。re: MultiBindng にコンバーターがなかった場合、バインディングの戻り値は Visibility 値である必要があります。式からコンバーターを削除すると、問題が解決する場合があります。

あなたのケースでは、各 MultiBinding 値の FallbackValue をスキップし、現在のように MultiBinding に FallbackValue を設定します。

<MultiBinding Converter="{StaticResource AndToVisibilityConverter1}" FallbackValue="Visible">
    <Binding Path="IsConnected" />
    <Binding Path="CurrentUser.IsConsumerOnlyAgent" Converter="{StaticResource InvertedBooleanConverter1}" />
</MultiBinding>
于 2013-01-09T01:40:01.380 に答える
5

いくつかのテストの後、MultiBinding の「子バインディング」が失敗すると (UnsetValue またはバインドされたプロパティが見つからないために)、子バインディングの FallbackValues が MultiBinding のコンバーターに渡されるようです。

奇妙な点は、子バインディングの FallbackValue の型がMultiBindingのターゲットと一致する必要があることです。MultiBinding コンバーターは、その型に一致しないバインディングから値を取得できるため、この要件がわかりません。

これを念頭に置いて、最も簡単な回避策は、MultiBinding のコンバーターを変更して複数の型を処理することです。この場合、ブール値と可視性を処理する必要があります。

つまり、私の convert 関数は次のようになります。

    public object Convert( object[] values, Type targetType, object     parameter, System.Globalization.CultureInfo culture )
    {
        var bools = values.Where( b => b is bool ).Cast<bool>();
        var vis = values.Where( v => v is Visibility ).Cast<Visibility>();

        // if no usable values, return unset
        if( vis.Count() + bools.Count() == 0 )
            return DependencyProperty.UnsetValue;

        // if true, return visible
        if( bools.All( b => b ) && vis.All( v => v == Visibility.Visible ) )
            return Visibility.Visible;

        // if false, see if hidden or collapsed is specified
        var param = parameter as string;

        Visibility ret;
        if( Enum.TryParse( param, out ret ) )
            return ret;

        // default to collapsed
        return Visibility.Collapsed;
    }

この回避策では、Visible を true に指定し、それ以外を false に指定して、要求された動作を提供する必要があります。

    <MultiBinding Converter="{x:Static con:MultiAndToVisibilityConverter.Instance}">
        <Binding Path="IsChecked" ElementName="CheckButton"/>
        <Binding Path="RadioOne.IsChecked" FallbackValue="{x:Static Visibility.Visible}"
                 Converter="{x:Static con:BoolInverterConverter.Instance}"/>
    </MultiBinding>
于 2013-09-04T19:19:28.490 に答える