2011-10-24 4 views
0

私はボーダープロパティの背景をリスト内の要素にバインドしたいと思います。Border.BorderをリソースディクショナリからLinearGradientBrushにバインド

私はfollwingを保持している辞書を持っている:

<LinearGradientBrush x:Key="ConfigurationItemBackground" EndPoint="0.5,1" StartPoint="0.5,0"> 
    <GradientStop Color="#FFAABBCC" Offset="1"/> 
    <GradientStop Color="#FFCCDDEE" Offset="0.7"/> 
</LinearGradientBrush>  

<LinearGradientBrush x:Key="NavigationItemBackground" EndPoint="0.5,1" StartPoint="0.5,0"> 
    <GradientStop Color="#FFD97825" Offset="1"/> 
    <GradientStop Color="#FFFF9A2E" Offset="0.7"/> 
</LinearGradientBrush> 

は今、私は「BackgroundStyle」と呼ばれるプロパティを含むオブジェクトを保持するのObservableCollectionを埋めます。私はスタイルを作られた背景を持つリストボックスを埋めるとき、私は「BackgroundStyle」の背景をバインドしたい

<Border x:Name="Border" BorderThickness="1" CornerRadius="4" Width="120" Height="80" 
     VerticalAlignment="Center" HorizontalAlignment="Center" Padding="4" 
     BorderBrush="Black" Background="{Binding Path=BackgroundStyle}"> 

私ならば、それは動作しませんBackgroundStyleは=「赤」や「緑」が、場合、これは、うまく機能"ConfigurationItemBackground"を使用してください。

提案がありますか?あなたの助けのための 感謝;)

-Tim-

+0

ObservableCollectionはどのようにボーダーに関連していますか?あなたは境界のDataContext、または直接の親のいずれかにそれを設定しますか? –

+0

@PhilippSchmid:彼の 'ListBox'はそのコレクションを' ItemsSource'として持っています。 'Border'は' DataTemplate'のように見え、 'Background'を' BackgroundStyle'プロパティにバインドしています。 –

答えて

0

は、あなたの内のリソースのキーを格納するためのデータバインディングを使用することが本質的である、あなたがやろうとしている正確に何を行うことができませんバインドされたオブジェクト。最も近いのはthis questionへの答えです。これは基本的にValueConverterを使用してアプリケーションのリソースからリソースを取得します。

残念ながら、これはあなたのやりたいこと、つまりローカルのリソースを使用しては機能しません。そのためには、stringの値をブラシに変換する独自のカスタムValueConverterを書く方がよいでしょう。

あなたこのような一般的な何かを行うことができます:(私は自宅でだと目の前でのVisual Studioを持っていない

<Window.Resources> 
    <my:ResourceKeyConverter x:Key="keyConverter"> 
     <ResourceKeyConverter.Resources> 
      <LinearGradientBrush x:Key="ConfigurationItemBackground" EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FFAABBCC" Offset="1"/> 
       <GradientStop Color="#FFCCDDEE" Offset="0.7"/> 
      </LinearGradientBrush>  

      <LinearGradientBrush x:Key="NavigationItemBackground" EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FFD97825" Offset="1"/> 
       <GradientStop Color="#FFFF9A2E" Offset="0.7"/> 
      </LinearGradientBrush> 
     </ResourceKeyConverter.Resources> 
    </my:ResourceKeyConverter> 
</Window.Resources> 

... 

<Border Background="{Binding BackgroundStyle, Converter={StaticResource keyConverter}}"> 
</Border> 

[ValueConversion(typeof(string), typeof(object))] 
public class ResourceKeyConverter : IValueConverter 
{ 
    public ResourceKeyConverter() 
    { 
     Resources = new ResourceDictionary(); 
    } 

    public ResourceDictionary Resources { get; private set; } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Resources[(string)value]; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new InvalidOperationException(); 
    } 
} 

を次に、このようにそれを使用します私はいくつかの調整が必要かもしれないが、大部分は正しいはずです)。

関連する問題