私は単純に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に送信されていません。
MSDNから:
UnsetValueは、WPFプロパティシステムが要求されたDependencyProperty値を決定できないシナリオで使用される標識値です。 null参照(Visual BasicではNothing)ではなくUnsetValueが使用されます。これは、null参照は有効な(そして頻繁に使用される)DefaultValueだけでなく、有効なプロパティ値になる可能性があるためです。
つまり、次のいずれかを意味します。
ControlTemplate
またはDataTemplate
)を使用していて、その値には、ロード時にDataSourceが設定されていません。したがって、コンバーターを2回ヒットします。1つ目はUnsetValue、2つ目はブール値です。心配する必要はありません。Binding
は正しくありません。つまり、バインディングが値を決定できないため、UnsetValueが発生します。おそらく警告が表示されるはずです。また、あなたがするようにあなたはコンバーターを組み合わせることができません。
内部バインディングのコンバーターを削除すると、修正されるはずです! :)
お役に立てれば!