将静态资源绑定到WPF中的现有值

时间:2017-03-04 11:00:05

标签: c# wpf xaml

我想简化WPF中的绑定。比如,我正在App.xaml中创建一个FontFamily资源,它绑定到应用程序设置中的字符串值,以避免在每个窗口中存在长行绑定表达式。但我发现我找不到办法做到这一点。

据说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 个答案:

答案 0 :(得分: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));
}

感谢@mkoertgenthis answer中分享找到的内容。