如何格式化Silverlight DataGrid列中的数字或文本?

时间:2011-04-13 10:13:48

标签: c# .net silverlight datagrid

您好 我有自动生成列的DataGrid。有些列是字符串,有些是int,有些是double。 如何在每列上设置显示格式? (Silverlight 4) 顺便说一句,我读了somwhere建议来捕捉AutoGenerating事件,并把这样的东西放到这样的

private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
      e.Column.Format="N0";
}

e.Column.Format不存在!

3 个答案:

答案 0 :(得分:3)

参考这个网站,我认为这是你正在寻找的,它应该与Toolkit控件而不是telerik控件一起使用。 干杯

http://www.telerik.com/community/forums/silverlight/gridview/how-to-format-autogenerated-columns.aspx

void gridView_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyType == typeof(DateTime))
    {
         DataGridBoundColumn obj = e.Column as DataGridBoundColumn;
         if (obj != null && obj.Binding != null)
              obj.Binding.StringFormat = "{0:d}";
    }
}

答案 1 :(得分:2)

更新: *使用MVVM,绑定您的列表,阻止autogeneratecolumns然后使用datatemplate自定义celltemplate(也将为您提供更多的灵活性,以及​​如何在列上显示内容)然后格式化文本块文本。

public partial class MainPage : UserControl, INotifyPropertyChanged
    {
        private ObservableCollection<CustomClass> _myList;

        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<CustomClass> MyList
        {
            get { return _myList ?? (_myList = new ObservableCollection<CustomClass>()); }
            set
            {
                _myList = value;
                RaisePropertyChanged("MyList");
            }
        }

        protected void RaisePropertyChanged(string propertyname)
        {
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyname));
        }

        public MainPage()
        {
            InitializeComponent();
            this.DataContext = this;

            MyList.Add(new CustomClass() { PropertyToBeWatched = "12"});
            MyList.Add(new CustomClass() { PropertyToBeWatched = "23" });
            MyList.Add(new CustomClass() { PropertyToBeWatched = "24" });
            MyList.Add(new CustomClass() { PropertyToBeWatched = "25" });

        }

}

XAML:

<sdk:DataGrid ItemsSource="{Binding MyList}" RowStyle="{StaticResource Style1}" AutoGenerateColumns="False">
            <sdk:DataGrid.Columns>
                <sdk:DataGridTemplateColumn>
                    <sdk:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding SomeEntity, StringFormat=c}"  />
                        </DataTemplate>
                    </sdk:DataGridTemplateColumn.CellTemplate>
                </sdk:DataGridTemplateColumn>
                <sdk:DataGridTextColumn Binding="{Binding PropertyToBeWatched}" Header="Property1"/>
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>

希望这有帮助。

答案 2 :(得分:1)

我不知道是否知道MVVM模式。使用它的方法,您可以为绑定到DataGrid的项创建其他类(ViewModel)。

例如,假设您有一个类:

public class MyObject
{
  public int Value1 { get; set; }
  public double Value2 { get; set; }
  public string Value3 { get; set; }
}

所以你可以像这样创建一个MyObjectViewModel类:

public class MyObjectViewModel 
{
  private MyObject _object;

  public MyObjectViewModel(MyObject obj)
  {
    _object = obj;
  }

  public string Value1 
  { 
    get
    {
      return _object.Value1.ToString() //format for int
    }
  }

  public string Value2
  { 
    get
    {
      return _object.Value2.ToString() //format for double 
    }
  }

  public string Value3
  { 
    get
    {
      return _object.Value3
    }
  }
}

然后在数据绑定之前,您可以将MyObject的集合转换为MyObjectViewModel的集合并绑定此集合。这样您就可以随意格式化您的属性。