2017-03-04 79 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找到。