我有以下情况:
我有几个视图模型对象,其中一些实现一个接口ISomeInterface
,有些则没有。 接口暴露了一个属性称为SomeEnumeration
( IEnumerable<T>
例如:
public sealed class ViewModelA : ViewModelBase, ISomeInterface
{
// ...
IEnumerable<Foo> ISomeInterface.SomeEnumeration
{
get { ...; }
}
}
public sealed class ViewModelB : ViewModelBase
{
// ...
}
我的XAML,到目前为止,已经被设计的方式,无论是的ViewModels的正好有我反对(即绑定属性PropertyA
, PropertyB
等)。 其中,我对结合的性质不上,我设置为中的ViewModels存在我还没有跑进情况尚未DataContext
。 但是,现在我会...这将是针对明确实施的属性(我不知道如果让在WPF绑定引擎有什么区别)。
基本上,我的XAML看起来像下面这样:
<StackPanel
Visiblity="{Binding Path=SomeEnumeration, Converter={StaticResource AnyConverter}">
...
</StackPanel>
我不知道这是否会甚至工作,因为:
- 并不是每一个
DataContext
将包含属性(如果它不,它应该被隐藏)......我应该在这种情况下怎么办? - 对于
DataContext
s表示不含该属性,明确实施...你要投第一还是什么?
一般情况下,当你想使用WPF数据绑定引擎,你也想利用FallbackValue
和TargetNullValue
结合特性。 做这些究竟做什么?
FallbackValue:获取或设置值时,绑定无法返回值。
TargetNullValue:获取或设置在目标使用时,源的值是空值。
乔恩解释绑定引擎很好在这个答案 :
Binding.DoNothing是一个对象实例,你正在从值转换器返回; 它指示绑定引擎并不更新目标属性的值。 这里有一个很好的例子用的,你可以使用这是什么的约什 - 史密斯。
FallbackValue是您在绑定设置属性; 它允许你指定的值将被应用到目标属性,如果:
- 绑定源不能被解析(例如错误的绑定路径),或
- 的粘结性值等于DependencyProperty.UnsetValue,或
- 用于结合的值转换器抛出异常,或
- 用于结合返回DependencyProperty.UnsetValue值转换器,或
- 由绑定管道所产生的值是无效的目标特性(例如错误的类型)
TargetNullValue也是你绑定设置属性; 它允许你指定要应用到目标财产,如果源属性的值为null值。 例如,如果你绑定一个文本框的字符串属性TargetNullValue让你挑,如果源字符串为null什么出现在文本框中。
至于结合“显式实现接口”,真正的问题应该是你如何设置路径的接口属性,因为说接口实现并不重要。 这实际上是很容易在XAML做的,下面是一个例子:
<TextBox Text="{Binding Path=(local:ISomeInterface.SomeProperty)}" />
因此,要直接回答你的问题:
- 利用
FallbackValue
(和任选TargetNullValue
如有必要)。 例如,传入null时结合值不能由于绑定错误来解决。 - 利用为Path属性绑定到一个接口的属性的正确图案(见上面的例子)。
XAML用法:
<StackPanel Visiblity="{Binding Path=(local:ISomeInterface.SomeEnumeration),
Converter={StaticResource AnyConverter},
FallbackValue={x:Null}}">
...
</StackPanel>
最后一点:如果绑定早期失败,空FallbackValue
不会传递到转换器的值,这将是最后使用的值是否绑定失败在资源层级或转换器级或等,所以不要指望而传递零到它的转换器将仍然运行。
快速和良好的修复你的情况是将所有的逻辑在其中已经到位的转换器。
XAML:(你的绑定)
<StackPanel
Visiblity="{Binding Path=., Converter={StaticResource AnyConverter}">
...
</StackPanel>
CS:(你的转换器)
Convert()
{
return value Is ISomeInterface ?
(((ISomeInterface)value).SomeEnumeration == SomeEnumeration.SomeValue ?
Visibility.Visible : Visibility.Collapsed) : Visibility.Collapsed;
}
文章来源: How do I use an explicitly implemented interface property and wpf visiblity together properly?