web-dev-qa-db-ja.com

MultiBindingの値を変換するときにDependencyProperty.UnsetValueを取得するのはなぜですか?

私は単純にORの2つの値を持つ非常に単純なIMultiValueConverterを持っています。以下の例では、同様にシンプルなブールインバーターを使用して最初の値を反転させます。

<MultiBinding Converter="{StaticResource multiBoolToVis}">
    <Binding Path="ConditionA" Converter="{StaticResource boolInverter}"/>
    <Binding Path="ConditionB"/>
</MultiBinding>

そしてインバーター:

public class BoolInverterConverter : IValueConverter
{
    #region IValueConverter Members
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !((bool)value);
        }
        return null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    #endregion
}

BoolInverterを含めると、MultiValueConverterの最初の値が「DependencyProperty.UnsetValue」になります。コンバーターを使用しなくても問題ありません(もちろん、目的のロジック以外は問題ありません)。

何か不足していますか?デバッガーをステップ実行すると、InverseBoolConverterが渡した値を正しく反転していることを示していますが、その値はMultiValueConverterに送信されていません。

29
Erik Kerber

MSDNから:

UnsetValueは、WPFプロパティシステムが要求されたDependencyProperty値を決定できないシナリオで使用される標識値です。 null参照(Visual BasicではNothing)ではなくUnsetValueが使用されます。これは、null参照は有効な(そして頻繁に使用される)DefaultValueだけでなく、有効なプロパティ値になる可能性があるためです。

つまり、次のいずれかを意味します。

  • テンプレート(ControlTemplateまたはDataTemplate)を使用していて、その値には、ロード時にDataSourceが設定されていません。したがって、コンバーターを2回ヒットします。1つ目はUnsetValue、2つ目はブール値です。心配する必要はありません。
  • あなたのBindingは正しくありません。つまり、バインディングが値を決定できないため、UnsetValueが発生します。おそらく警告が表示されるはずです。

また、あなたがするようにあなたはコンバーターを組み合わせることができません。

内部バインディングのコンバーターを削除すると、修正されるはずです! :)

お役に立てれば!

31
Arcturus