DataGridColumn标头内容WPF

时间:2012-01-29 18:08:43

标签: wpf silverlight datagrid datatemplate wpfdatagrid

我想本地化一个演示文稿,我正在大脑冻结这个。我正在使用标记扩展,所以不要这样:

<DataGridTextColumn Header="Number" Binding="{Binding Number}" Width="60" CellStyle="{StaticResource NumberStyle}" />

我想要这个:

<DataGridTextColumn Header="{Resx Key=Header_Number}" Binding="{Binding Number}" Width="60" CellStyle="{StaticResource NumberStyle}" />

经过充分测试的标记将返回当前文化的正确文本。但它没有用。我假设我需要HeaderStyle或HeaderTemplate但是......

修复是什么?

干杯,
Berryl

修改

由于不工作我的意思是它不会在英文中返回文本“数字”,而是返回默认值(即“#Header_Number”。

正在工作,我的意思是

    <Label FontWeight="Bold" Grid.Row="0" Grid.Column="0" Content="{Resx Key=Label_Amount}"/>

以英文返回“金额”。

最终编辑

我的不好,这实际上是因为WPF数据网格列不能继承其父级的DataContext。

标记扩展具有ResxName属性,我想为整个窗口设置一次:

    resx:ResxProperty.Name="NMoneys.Presentation.Resources.AllocatorView"
    Title="{Resx Key=Window_Title}" 

但是由于数据网格中的标题不是可视化树的一部分(尽管看起来确实应该如此!),我必须再次专门设置Resx的名称,如

            <DataGridTextColumn Header="{Resx ResxName=NMoneys.Presentation.Resources.AllocatorView, Key=ColumnHeader_Number}" Binding="{Binding Number}" Width="60" CellStyle="{StaticResource NumberStyle}" />

我之前遇到过这种情况并看到了一些转发DC的技术,但在这种情况下它不值得打扰。

干杯,
Berryl

1 个答案:

答案 0 :(得分:1)

我假设您有代表您实体的模型。我所做的是使用数据注释。这是一个例子。编辑:提供带有屏幕截图的MVVM类

<强>模型

using System.ComponentModel.DataAnnotations;

using Silverlight.Infrastructure.Properties;

namespace Silverlight.Infrastructure.Models
{
    public class Customer
    {
        [Display(ResourceType = typeof(Resources), Name = "CustomerIdHeader")]
        public int Id { get; set; }

        // There must be an entry CustomerNameHeader in the resources else it 
        // will throw an exception
        [Display(ResourceType = typeof(Resources), Name = "CustomerNameHeader")]
        public string Name { get; set; }
    }
}

标题内容将自动绑定到属性的显示。

<强>视图模型

using Silverlight.Infrastructure.Models

namespace Silverlight.ModuleA.ViewModels
{
    //Prism namespaces
    public class CustomerViewModel : NotificationObject
    {
        public CustomerViewModel()
        {   
            // service for my customers.
            CustomeService customerService = new CustomerService();
            Customers = customerService.GetCustomers()
        }   

        public ObservableCollection<Customer> Customers {get;set;}
    }
}

查看

<UserControl>
    <Grid x:Name="LayoutRoot">
        <data:DataGrid x:Name="CustomerGrid" ItemsSource="{Binding Customers}" AutoGenerateColumns="False" >
                    <data:DataGrid.Columns>
                        <data:DataGridTextColumn Binding="{Binding Id, Mode=TwoWay}" />
                        <data:DataGridTextColumn Binding="{Binding Name, Mode=TwoWay}"/>
                        <data:DataGridTextColumn Binding="{Binding Surname, Mode=TwoWay}"/>
                        <data:DataGridTextColumn Binding="{Binding Company, Mode=TwoWay}"/>
                    </data:DataGrid.Columns>
            </data:DataGrid>
    </Grid>
</UserControl>

The DataGrid in the program!

然后是typeof(StringLibrary)中的资源

Resource File

如您所见,显示的名称等于资源文件中的ResourceKey。大约2-3周前,当我使用XML进行开发和测试时,我首先想出了注释。但是像AutoMapper这样的东西可以将你的对象映射到像这样的pocos,或者你甚至可以使用WCF RIA服务,你可以有类似的注释。 WCF RIA实际上是使用它们的人,但我只是以不同的方式使用它们。

这里和那里可能会有一些技巧来实现这一目标。但是当你这样做时,你真的得到了一个简单的解决方案

我希望我提供了足够的信息。