Как отформатировать числа или текст в столбцах Silverlight DataGrid? - PullRequest
0 голосов
/ 13 апреля 2011

Привет, я получил DataGrid с автоматически сгенерированными столбцами.Некоторые столбцы являются строками, некоторые являются int, а некоторые - двойными.Как установить формат отображения для каждого столбца?(Silverlight 4) Кстати, я читал некоторые предложения, чтобы поймать событие AutoGenerating и поставить что-то вроде этого

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

, но e.Column.Format не существует!

Ответы [ 3 ]

3 голосов
/ 14 апреля 2011

Обращаясь к этому сайту, я думаю, это то, что вы ищете, он должен работать с элементом управления 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}";
    }
}
2 голосов
/ 13 апреля 2011

ОБНОВЛЕНО: * с помощью MVVM свяжите свой список, предотвратите автогенерацию столбцов, затем настройте шаблон ячейки с табличкой данных (также предоставит вам больше гибкости в том, что и как показывать вещи в столбце), затем отформатируйте текстовый блок текст.

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>

Надеюсь, это поможет.

1 голос
/ 13 апреля 2011

Я не знаю, знаю ли шаблон MVVM. Используя этот подход, вы можете создать дополнительный класс (ViewModel) для элементов, которые вы привязываете к DataGrid.

Например, предположим, у вас есть класс:

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 и связать эту коллекцию. Таким образом, вы можете отформатировать ваши свойства как вам угодно.

...