Как управлять данными ячейки, отображаемыми в WPF Toolkit DataGrid во время выполнения? - PullRequest
0 голосов
/ 02 декабря 2009

Следующий код WPF отображает содержимое FirstName и ZipCode в WPF Toolkit DataGrid .

Однако я не хочу просто отображать данные такими, какие они есть, а слегка измененными , например. Я мог бы хотеть отобразить все почтовые индексы для отображения с «-0000» в конце, или я могу хотеть отобразить « n / a », если ячейка пуста.

Я смог найти только CopyingCellClipboardContent , который, кажется, не выполняет то, что я хочу.

Я думаю, мне может понадобиться конвертер , но я не уверен, как это сделать в этом примере.

Как я могу манипулировать содержимым ячеек DataGrid во время выполнения?

XAML:

<Window x:Class="TestControl3423.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="Window2" Height="300" Width="500">
    <StackPanel>
        <tk:DataGrid x:Name="dataGrid" 
                     Margin="0 0 0 10"
                     AutoGenerateColumns="False" 
                     CanUserAddRows="False"
                     HeadersVisibility="Column" 
                     MaxHeight="400"
                     IsReadOnly="True"
                     Background="#fff"
                     ColumnWidth="SizeToHeader">
        </tk:DataGrid>
    </StackPanel>
</Window>

Код сзади:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Data;
using System.Windows.Documents;
using Microsoft.Windows.Controls;

namespace TestControl3423
{
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            dataGrid.ItemsSource = Customer.GetCustomers();

            dataGrid.Columns.Clear();

            DataGridTextColumn dgtc1 = new DataGridTextColumn();
            dgtc1.Header = "First Name";
            dgtc1.Binding = new Binding("FirstName");
            dgtc1.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
            dataGrid.Columns.Add(dgtc1);

            DataGridTextColumn dgtc2 = new DataGridTextColumn();
            dgtc2.Header = "Zip Code";
            dgtc2.Binding = new Binding("ZipCode");
            dgtc2.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
            dgtc2.CopyingCellClipboardContent += new EventHandler<DataGridCellClipboardEventArgs>(dgtc2_CopyingCellClipboardContent);
            dataGrid.Columns.Add(dgtc2);
        }

        void dgtc2_CopyingCellClipboardContent(object sender, DataGridCellClipboardEventArgs e)
        {
            DataGridTextColumn dgtc = sender as DataGridTextColumn;
            dgtc.SetValue(dgtc.GetValue() + "-0000"); //ERROR
        }
    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Street { get; set; }
        public string Location { get; set; }
        public string ZipCode { get; set; }

        public static List<Customer> GetCustomers()
        {
            List<Customer> customers = new List<Customer>();
            customers.Add(new Customer { FirstName = "Jim", LastName = "Jones", ZipCode = "23434" });
            customers.Add(new Customer { FirstName = "Joe", LastName = "Adams", ZipCode = "12312" });
            customers.Add(new Customer { FirstName = "Jake", LastName = "Johnson", ZipCode = "23111" });
            customers.Add(new Customer { FirstName = "Angie", LastName = "Reckar", ZipCode = "54343" });
            customers.Add(new Customer { FirstName = "Jean", LastName = "Anderson", ZipCode = "16623" });
            return customers;
        }

    }
}

1 Ответ

2 голосов
/ 03 декабря 2009

Пожалуйста, посмотрите, будет ли работать код ниже для вас. Я создал класс-потомок DataGridTextColumn с переопределенным методом GenerateElement. Там вы можете работать с элементом управления TextBlock, созданным для данной ячейки, например, изменить его значение, чтобы добавить дополнительные цифры для почтовых индексов.

...
DataGridTextColumn dgtc2 = new ExtendedDataGridTextColumn(); 
dgtc2.Header = "Zip Code"; 
...

public class ExtendedDataGridTextColumn : DataGridTextColumn 
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        TextBlock element = (TextBlock)base.GenerateElement(cell, dataItem);
        element.Text = ((Customer)dataItem).ZipCode + "-0000";
        return element;
    }
}

надеюсь, это поможет, С уважением

...