C# 如何将显式实现的接口属性和wpf visiblity正确地结合使用?

C# 如何将显式实现的接口属性和wpf visiblity正确地结合使用?,c#,wpf,data-binding,datacontext,explicit-interface,C#,Wpf,Data Binding,Datacontext,Explicit Interface,我有以下情况: 我有几个ViewModel对象,其中一些实现了接口isomointerface,而另一些没有。接口公开了一个名为SomeEnumeration(IEnumerable)的属性 例如: public sealed class ViewModelA : ViewModelBase, ISomeInterface { // ... IEnumerable<Foo> ISomeInterface.SomeEnumeration { g

我有以下情况:

我有几个ViewModel对象,其中一些实现了接口
isomointerface
,而另一些没有。接口公开了一个名为
SomeEnumeration
IEnumerable
)的属性

例如:

public sealed class ViewModelA : ViewModelBase, ISomeInterface
{
    // ...

    IEnumerable<Foo> ISomeInterface.SomeEnumeration
    {
        get { ...; }
    }
}

public sealed class ViewModelB : ViewModelBase
{
    // ...
}
我不确定这是否有效,因为:

  • 并非每个
    DataContext
    都包含该属性(如果不包含,则应将其隐藏)。。。在这种情况下我该怎么办
  • 对于确实包含该属性的
    DataContext
    s,它是显式实现的。。。你必须先选演员吗

  • 对于您的情况,一个快速而好的修复方法是将您的所有逻辑放在已经就位的转换器中

    xaml:(您的绑定)


    对于您的情况,一个快速而好的修复方法是将您的所有逻辑放在已经就位的转换器中

    xaml:(您的绑定)


    通常,当您想要使用WPF数据绑定引擎时,您还需要利用和绑定属性。这些到底是做什么的

    FallbackValue:获取或设置绑定无法执行时的值 返回一个值。
    TargetNullValue:获取或设置所使用的值 当源的值为空时,在目标中

    Jon很好地解释了绑定引擎:

    Binding.DoNothing是您主动从中返回的对象实例 值转换器;它指示绑定引擎不更新 目标属性的值。这是Josh的一个很好的例子 史密斯告诉我你可能会用这个做什么

    FallbackValue是您在绑定上设置的属性;它允许你 指定要应用于目标属性的值,如果:

    • 无法解析绑定源(例如错误的绑定路径),或
    • 绑定属性值等于DependencyProperty.UnsetValue,或
    • 用于绑定的值转换器引发异常,或
    • 用于绑定的值转换器返回DependencyProperty.UnsetValue,或
    • 绑定管道生成的值对于目标属性无效(例如,类型错误)
    TargetNullValue也是您在绑定上设置的属性;它允许你 指定要应用于目标特性的值,如果该值 源属性的值为null。例如,如果将文本框绑定到 字符串属性TargetNullValue允许您选择在 如果源字符串为空,则为文本框


    至于绑定到“显式实现的接口”,真正的问题应该是如何设置接口属性的路径,因为接口如何实现并不重要。这在XAML中实际上很容易做到,下面是一个示例:

    <TextBox Text="{Binding Path=(local:ISomeInterface.SomeProperty)}" />
    

    最后一点注意:如果绑定提前失败,则null
    FallbackValue
    将不是传递给转换器的值,而是无论绑定在属性级别还是转换器级别失败等情况下使用的最终值。因此,不要期望转换器在传入null时仍然运行。

    通常,当您想要使用WPF数据绑定引擎时,您还需要利用和绑定属性。这些到底是做什么的

    FallbackValue:获取或设置绑定无法执行时的值 返回一个值。
    TargetNullValue:获取或设置所使用的值 当源的值为空时,在目标中

    Jon很好地解释了绑定引擎:

    Binding.DoNothing是您主动从中返回的对象实例 值转换器;它指示绑定引擎不更新 目标属性的值。这是Josh的一个很好的例子 史密斯告诉我你可能会用这个做什么

    FallbackValue是您在绑定上设置的属性;它允许你 指定要应用于目标属性的值,如果:

    • 无法解析绑定源(例如错误的绑定路径),或
    • 绑定属性值等于DependencyProperty.UnsetValue,或
    • 用于绑定的值转换器引发异常,或
    • 用于绑定的值转换器返回DependencyProperty.UnsetValue,或
    • 绑定管道生成的值对于目标属性无效(例如,类型错误)
    TargetNullValue也是您在绑定上设置的属性;它允许你 指定要应用于目标特性的值,如果该值 源属性的值为null。例如,如果将文本框绑定到 字符串属性TargetNullValue允许您选择在 如果源字符串为空,则为文本框


    至于绑定到“显式实现的接口”,真正的问题应该是如何设置接口属性的路径,因为接口如何实现并不重要。这在XAML中实际上很容易做到,下面是一个示例:

    <TextBox Text="{Binding Path=(local:ISomeInterface.SomeProperty)}" />
    
    最后一点注意:如果绑定提前失败,null
    FallbackValue
    将不是传递给转换器的值,而是在属性级别或转换器级别等绑定失败时使用的最终值。因此,不要期望转换器在传入null时仍然运行

      Convert()
      {
           return value Is ISomeInterface ? 
                  (((ISomeInterface)value).SomeEnumeration == SomeEnumeration.SomeValue ? 
                  Visibility.Visible :  Visibility.Collapsed) : Visibility.Collapsed;       
      }
    
    <TextBox Text="{Binding Path=(local:ISomeInterface.SomeProperty)}" />
    
    <StackPanel Visiblity="{Binding Path=(local:ISomeInterface.SomeEnumeration),
                                    Converter={StaticResource AnyConverter},
                                    FallbackValue={x:Null}}">
        ...
    </StackPanel>