2017-03-04 12 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

私は、別の問題を処理する過程で興味深い解決策を見つけました。

@ThomasLevesqueによって書かれthis articleに言及したこの素晴らしい小さなプロキシクラスは私の命の恩人である:

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)); 
} 

そしてthis answerで見つける共有のため@mkoertgenに感謝。

関連する問題