如何从WPF应用程序中的资源字典中正确获取资源?

时间:2011-10-31 09:06:56

标签: c# wpf refactoring resourcedictionary

每个人,在WPF应用程序中我都有资源字典,其中定义了很多用于控件和样式的DataTemplates。例如

    <DataTemplate x:Key="PriceColumnCellTemplate">
    <Grid VerticalAlignment="Center">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TextBlock
            Text="{Binding Path=PriceQuotation, Mode=OneWay}"
            Grid.Column="1"
            VerticalAlignment="Center"
            Margin="2,0"
        />
    </Grid>
</DataTemplate>

在View后面的代码中我必须得到这个数据模板。现在这是以下列方式实现的

    private DataTemplate _priceColumnCellTemplate;
    private DataTemplate PriceColumnCellTemplate
    {
        get
        {
            if (_priceColumnCellTemplate == null)
                _priceColumnCellTemplate = (DataTemplate)_applicationResources["PriceColumnCellTemplate"];

            return _priceColumnCellTemplate;
        }
    }

    private DataTemplate _priceColumnCellEditingTemplate;
    private DataTemplate PriceColumnCellEditingTemplate
    {
        get
        {
            if (_priceColumnCellEditingTemplate == null)
                _priceColumnCellEditingTemplate = (DataTemplate)_applicationResources["PriceColumnCellEditingTemplate"];

            return _priceColumnCellEditingTemplate;
        }
    }

    private DataTemplate _alternativePriceColumnCellTemplate;
    private DataTemplate AlternativePriceColumnCellTemplate
    {
        get
        {
            if (_alternativePriceColumnCellTemplate == null)
                _alternativePriceColumnCellTemplate = (DataTemplate)_applicationResources["AlternativePriceColumnCellTemplate"];

            return _alternativePriceColumnCellTemplate;
        }
    }

为每个DataTemplate创建私有字段,并获取该字段的get值属性。 以同样的方式实施样式。

此代码中的问题是当我需要添加新的DataTemplate时,我应该添加上面的代码来获取此DataTemplate表单资源。

如何重构此代码以避免代码重复,并保存相同的功能,可能存在更灵活的方式从xaml文件中获取资源。

请帮我提一下建议,或者举个例子来说明如何解决这个问题。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

DataTemplates或任何资源不需要保存在视图模型后面的代码中。它们可以在DataTemplateSelectors的情况下动态提供,动态选择任何元素的数据模板到它们应用的位置......

这会更好地解决您的问题吗?