2011-07-18 55 views
3

我想縮短設置綁定如何在XAML中定義對現有對象的引用?

{Binding Source={x:Static properties:Settings.Default}, Path=Password} 

要像

{settingsBinding Password} 

通過移動聲明的一部分,以全球資源字典。但似乎我無法在這裏聲明綁定。任何想法如何把這個關掉?

我想至少使它像這樣

{Binding Source={StaticResource Settings}, Path=Password} 

所以我沒有包括屬性的命名空間每次。

回答

4

爲了得到第一個語法,你必須從Binding派生並註明出處:

public class SettingsBinding : Binding { 
    public SettingsBinding(string path) : base(path) { Source = Settings.Default; } 
    public SettingsBinding() { Source = Settings.Default; } 
} 

然後,您可以使用:{xxx:SettingsBinding Password}。但是,您仍然必須指定該類的名稱空間。我雖然不會推薦這種方法:綁定往往是相當冗長,但你知道發生了什麼,因爲語法總是相同的。

爲了得到你想要的第二個語法,簡單地定義你的x:Static作爲一種資源,如:

<Window.Resources> 
    <x:Static Member="properties:Settings.Default" x:Key="Settings" /> 
</Window.Resources> 

現在可以使用StaticResource引用它。

+2

+1;這是專門解決OP提出的問題的一個很好的解決方案。 **然而**,我認爲託德的答案是OP應該實施的。不要在視圖中綁定 - 綁定到視圖模型,並讓視圖模型轉發「密碼」的值。這會減少代碼中的耦合。 –

+0

也許第二種解決方案是一種更好的編程風格,但它會產生大量的樣板代碼。我喜歡這種簡單而優雅的解決方案。 – Poma

3

首先我要說我是一個相對的WPF新手,我不知道您的專業水平,所以請原諒我,如果這不是你想要的。如果要解決特定問題或想更一般如何使用資源來存儲源路徑知道我不能完全告訴。我只能在前者嘗試一個答案。

如果您的封閉對象的數據上下文設置爲Properties.Settings.Default那麼你可以只使用

{Binding Password} 

這不正是你問什麼,但仍然是很短。我可以看到你會如何想獲得密碼字段,無論你在哪裏,不管當前的數據上下文是什麼。在我的代碼中,我的所有XAML都有一個ViewModel數據上下文。所有視圖模型都來自ViewModelBase。在ViewModelBase中,您可以添加一個Password屬性並仍然使用上面顯示的語法。

+0

1;我推薦第二種解決方案,而不是直接綁定到'Properties.Settings.Default'。這使從應用程序的其餘抽象的視圖,並讓視圖模型決定在哪裏得到這個值。它將減少OP代碼中的耦合。 –