2017-03-04 106 views
1

我想簡化WPF中的綁定。假設我在App.xaml中創建了一個FontFamily資源,該資源綁定到應用程序設置中的字符串值,以避免在每個窗口中出現一長串綁定表達式。但是我發現我找不到這樣做的方法。將靜態資源綁定到WPF中的現有值

據說XAML 2009中有一個x:Arguments,但這不適用於此。

我的方法:

<DynamicResource x:Key="PrimaryFont" ResourceKey="{Binding PrimaryFont, Source={x:Static properties:Settings.Default}, Converter={StaticResource StringToFontFamilyConverter}}"/> 

失敗,拋出一個XamlParseException

<FontFamily x:Key="PrimaryFont"> 
    <Binding Path="PrimaryFont" Source="{x:Static properties:Settings.Default}" Converter="{StaticResource StringToFontFamilyConverter}"/> 
</FontFamily> 

這甚至不能編譯。

我不想在代碼背後添加,因爲我不想讓所有的東西看起來像一團糟。那可能嗎?

編輯:這不是Setting global font family的副本。 FontFamily只是爲了解釋的目的,在現實世界中會有多種元素我想要簡化綁定,而元素可能不是新風格的好目標。

+1

我不明白這是如何重複的? – KyloRen

+0

不需要轉換器,因此Binding部分相對較小:''FontFamily = {{Binding MyFont,Source = {x:Static p:Settings.Default}}「'',假設有''' ''Settings.Default''中名爲'MyFont'的字符串''。另外,我使用''p''而不是''''來使它更小。 – Ron

+0

@Ron謝謝。我現在將在可應用的設置上使用它。 –

回答

1

原來我在處理另一個問題的過程中找到了一個有趣的解決方案。

這真棒小代理在this article通過@ThomasLevesque書面提到的類是我生命的救星:

public class BindingProxy : Freezable 
{ 
    #region Overrides of Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    #endregion 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

並感謝@mkoertgen分享在this answer找到。