Xaml ResourceKey作为变量不起作用

时间:2014-07-12 11:46:26

标签: c# wpf xaml variables resources

我正在使用ComboBox(WPF 4.0)来显示编辑器应用程序的用户定义的段落样式。 ComboBox有两列:

(1)段落样式的名称

(2)文本“abcABC123”,在某些属性中应该根据第一列中的段落样式进行格式化

(1)正在工作,(2)不是因为_ResourceKey_background,_ResourceKey_foreground和_ResourceKey_fontFamily都没有ResourceKeys 但包含ResourceKeys的变量。我该如何解决这个问题?

_NameInternal,_NameUI,_ResourceKey_background,_ResourceKey_foreground和_ResourceKey_fontFamily是公共属性 用户定义的段落样式类。

<ComboBox Name="_cbStylesPara" SelectedValuePath="_NameInternal"
          ItemsSource="{Binding Source={StaticResource _collectionViewSource_stylesPara}}" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition />
                </Grid.RowDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding _NameUI}" VerticalAlignment="Center" />
                <TextBlock Grid.Column="1" Text="abcABC123" Margin="3,0,0,0" VerticalAlignment="Center"
                           Background="{DynamicResource _ResourceKey_background}"
                           Foreground="{DynamicResource _ResourceKey_foreground}"
                           FontFamily="{DynamicResource _ResourceKey_fontFamily}" />
            </Grid>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

1 个答案:

答案 0 :(得分:0)

就像你说的资源是在App资源下声明的那样,你可以做的是创建一个IValueConverter并从它的Convert方法中返回资源值。

public class ResouceLookupConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        return App.Current.TryFindResource(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

XAML

<ComboBox>
  <ComboBox.Resources>
     <local:ResouceLookupConverter x:Key="ResouceLookupConverter"/>
  </ComboBox.Resources>
  ......
  <TextBlock Grid.Column="1" Text="abcABC123" Margin="3,0,0,0"
             VerticalAlignment="Center"
             Background="{Binding _ResourceKey_background,
                          Converter={StaticResource ResouceLookupConverter}}"
             Foreground="{Binding _ResourceKey_foreground,
                          Converter={StaticResource ResouceLookupConverter}}"
             FontFamily="{Binding _ResourceKey_fontFamily,
                          Converter={StaticResource ResouceLookupConverter}}" />
</ComboBox>

注意 :当然,您必须在XAML中将本地命名空间定义为声明Converter的命名空间。