[英]How do I use an explicitly implemented interface property and wpf visiblity together properly?
我有以下情況:
我有一些ViewModel對象,其中一些實現了ISomeInterface
接口,有些則沒有。 接口公開了一個名為SomeEnumeration
的屬性( IEnumerable<T>
)。
例如:
public sealed class ViewModelA : ViewModelBase, ISomeInterface
{
// ...
IEnumerable<Foo> ISomeInterface.SomeEnumeration
{
get { ...; }
}
}
public sealed class ViewModelB : ViewModelBase
{
// ...
}
到目前為止,我的XAML的設計方式使兩個ViewModel都具有我要綁定的屬性(即PropertyA
, PropertyB
等)。 我還沒有遇到過這樣的情況,即我設置為DataContext
的ViewModels上不存在我要綁定的屬性。 但是,現在我將……並且它將與明確實現的屬性相對(我不確定這是否會對WPF綁定引擎產生任何影響)。
基本上,我的xaml如下所示:
<StackPanel
Visiblity="{Binding Path=SomeEnumeration, Converter={StaticResource AnyConverter}">
...
</StackPanel>
我不確定這是否還能工作,因為:
DataContext
都將包含該屬性(如果不包含該屬性,則應將其隱藏)...在這種情況下我該怎么辦? DataContext
,它是顯式實現的……您是否必須先強制轉換? 通常,當您要使用WPF數據綁定引擎時,還需要利用FallbackValue
和TargetNullValue
綁定屬性。 這些到底是做什么的?
FallbackValue:當綁定無法返回值時獲取或設置值。
TargetNullValue:獲取或設置當源的值為null時在目標中使用的值。
Jon在此答案中很好地解釋了綁定引擎:
Binding.DoNothing是您從值轉換器主動返回的對象實例; 它指示綁定引擎完全不更新目標屬性的值。 這是喬什·史密斯(Josh Smith)的一個很好的例子,說明了該工具的用途。
FallbackValue是您在綁定上設置的屬性; 它允許您在以下情況下指定要應用於目標屬性的值:
- 綁定源無法解析(例如錯誤的綁定路徑),或者
- 綁定屬性值等於DependencyProperty.UnsetValue,或者
- 用於綁定的值轉換器引發異常,或者
- 用於綁定的值轉換器返回DependencyProperty.UnsetValue,或者
- 綁定管道產生的值對於目標屬性無效(例如,錯誤的類型)
TargetNullValue也是您在綁定上設置的屬性; 如果source屬性的值為null,則允許您指定要應用於目標屬性的值。 例如,如果將文本框綁定到字符串屬性,則TargetNullValue允許您選擇源字符串為null時文本框中顯示的內容。
that interface is implemented does not matter. 至於結合“顯式實現接口”,真正的問題應該是你如何設置路徑的接口屬性,因為說接口實現並不重要。 這實際上在XAML中很容易做到,下面是一個示例:
<TextBox Text="{Binding Path=(local:ISomeInterface.SomeProperty)}" />
因此,直接回答您的問題:
FallbackValue
(必要時使用TargetNullValue
)。 例如,當由於綁定錯誤而無法解析綁定值時,請傳遞null。 XAML用法:
<StackPanel Visiblity="{Binding Path=(local:ISomeInterface.SomeEnumeration),
Converter={StaticResource AnyConverter},
FallbackValue={x:Null}}">
...
</StackPanel>
最后一點:如果綁定提前失敗,則null FallbackValue
不會是傳遞給轉換器的值,無論綁定是在屬性級別還是在轉換器級別等等,它都是最終使用的值。因此不要期望在將null傳遞給轉換器時,轉換器仍將運行。
一種針對您的情況的快速而有效的解決方案是將所有邏輯放入已經就緒的轉換器中。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.