Как связать значение ячейки с определенным свойством объекта? - PullRequest
0 голосов
/ 15 марта 2011

У меня есть DataTable, который заполняется на уровне ячейки следующим типом:

public class GridCell
{
    public string Value { get; set}
    public Guid Id { get; set; }
}

Я привязал DataTable к DataGrid WPF Toolkit, но ячейки появляются пустыми. Как мне сказать DataGrid искать в свойстве Value моего типа GridCell содержимое ячейки?

Фрагмент привязки:

<DataGrid ItemsSource="{Binding SelectedItem.Table}" />

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Из ограниченной информации в вашем вопросе я предполагаю, что ваша таблица данных содержит столбцы пользовательских типов, которые я бы не рекомендовал, так как это сделает ваш код намного более сложным.Но если вы решите пойти по этому пути, вы можете реализовать свой собственный тип столбца для обработки этого.Я не пробовал этого, но эта ссылка выглядит многообещающе: Привязать DataTable к WPF DataGrid с помощью DataGridTemplateColumn Programatics

Вы также можете использовать преобразователи значений для достижения того же результата.В следующем примере передайте индекс столбца в качестве параметра, но вы также можете передать интересующее вас свойство, используя некоторый формат (например, 0-значение, означающее столбец 0, значение свойства).

XAML:

<Window x:Class="GridCellDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
    xmlns:GridCellDemo="clr-namespace:GridCellDemo"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>
        <GridCellDemo:CellConverter x:Key="CellConverter" />
    </Window.Resources>

    <Grid>
        <Controls:DataGrid ItemsSource="{Binding Data}" AutoGenerateColumns="False">
            <Controls:DataGrid.Columns>
                <Controls:DataGridTextColumn Header="Col 0" Binding="{Binding ., Converter={StaticResource CellConverter}, ConverterParameter=0}" />
                <Controls:DataGridTextColumn Header="Col 1" Binding="{Binding ., Converter={StaticResource CellConverter}, ConverterParameter=1}" />
            </Controls:DataGrid.Columns>
        </Controls:DataGrid>

    </Grid>
</Window>

Код:

using System;
using System.Data;
using System.Windows;
using System.Windows.Data;

namespace GridCellDemo
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            DataContext = this;
        }

        public DataTable Data
        {
            get
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("Col0", typeof(GridCell)));
                dt.Columns.Add(new DataColumn("Col1", typeof(GridCell)));

                DataRow row0 = dt.NewRow();
                dt.Rows.Add(row0);
                row0["Col0"] = new GridCell() { Value = "R0C0" };
                row0["Col1"] = new GridCell() { Value = "R0C1" };

                DataRow row1 = dt.NewRow();
                dt.Rows.Add(row1);
                row1["Col0"] = new GridCell() { Value = "R1C0" };
                row1["Col1"] = new GridCell() { Value = "R1C1" };

                return dt;
            }
        }
    }

    public class GridCell
    {
        public string Value { get; set;  }
        public Guid Id { get; set; }
    }

    public class CellConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            DataRowView drv = value as DataRowView;
            if (drv == null)
            {
                return string.Empty;
            }
            int columnIndex = int.Parse(parameter.ToString());
            GridCell gridCell = drv[columnIndex] as GridCell;
            return gridCell.Value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
0 голосов
/ 15 марта 2011

Попробуйте ItemsSource="{Binding Path=GridCellList}".

<DataGrid ItemsSource="{Binding GridCellList}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Value" Binding="{Binding Path=Value}" />
         <DataGridTextColumn Header="Guid" Binding="{Binding Path=Guid}" />
     </DataGrid.Columns>
 </DataGrid>
...