locked
Изменить содержимое Cell во время загрузки данных в DataGrid RRS feed

  • Вопрос

  • Есть коллекция, которая отображается в DataGrid.
    Нужно изменить значение "q" в одном поле элемента на "1", если другое его поле содержит true.


    <Window x:Class="WpfDataBind.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfDataBind"
            Title="MainWindow" Height="120" Width="525">
        
        <Grid Name="qqq">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <GridSplitter Grid.Column="1" Width="3"/>
            <Button Grid.Column="0" x:Name="button" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="button_Click"/>
            <DataGrid Name="mDataGrid" Grid.Column="2" CanUserAddRows="False" CanUserDeleteRows="False"/>
     
        </Grid>
    </Window>

    public partial class MainWindow : Window
        {
            List<C> lc;public MainWindow(){
                InitializeComponent();
     
                lc =new List<C>();
                lc.Add(new C { S1 ="q", S2 =true});
                lc.Add(new C { S1 ="q", S2 =false});
                lc.Add(new C { S1 ="q", S2 =false});
                lc.Add(new C { S1 =" ", S2 =true});
                lc.Add(new C { S1 ="q", S2 =false});
                lc.Add(new C { S1 ="q", S2 =true});
     
                mDataGrid.LoadingRow+= MDataGrid_LoadingRow;}privatevoid MDataGrid_LoadingRow(object sender, DataGridRowEventArgs e){
                DataGridRow vDataGridRow = e.Row;if(((C)vDataGridRow.Item).S1!=" "&&((C)vDataGridRow.Item).S2==true){
                    vDataGridRow.Loaded+= VDataGridRow_Loaded;}}privatevoid VDataGridRow_Loaded(object sender, RoutedEventArgs e){
                DataGridCell vDataGridCell = GetCell(mDataGrid, (DataGridRow)sender, 0);((TextBlock)vDataGridCell.Content).Text="1";}privatevoid button_Click(object sender, RoutedEventArgs e){
                mDataGrid.ItemsSource= lc;
                mDataGrid.Items.Refresh();}class C
            {string s1;bool s2;publicstring S1
                {get{return s1;}set{
                        s1 =value;}}publicbool S2
                {get{return s2;}set{
                        s2 =value;}}}public T GetVisualChild<T>(Visual parent)where T : Visual
            {
                T child =default(T);int numVisuals = VisualTreeHelper.GetChildrenCount(parent);for(int i =0; i < numVisuals; i++){
                    Visual v =(Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;if(child ==null){
                        child = GetVisualChild<T>(v);}if(child !=null){break;}}return child;}public DataGridCell GetCell(DataGrid grid, DataGridRow row, int column){if(row !=null){
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);if(presenter ==null){
                        grid.ScrollIntoView(row, grid.Columns[column]);
                        presenter = GetVisualChild<DataGridCellsPresenter>(row);}
     
                    DataGridCell cell =(DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);return cell;}returnnull;}}

    Все хорошо работает если перед нажатием на кнопку высоты окна достаточно для размещения всех строчек таблицы,
    1 True
    q False
    q False
    True
    q False
    1 True

    но если сделать высоту вмещающую только 2 строчки и прокрутить скролбар вниз, то работать начинает не правильно.
    1 True
    q False
    q False
    True
    1 False
    q True

    В чем тут причина?

    26 октября 2016 г. 20:18

Ответы

  • Добрый день.

    Вы немножко неправильно делаете.  данном случае надо задать столбцы в XAML, и у того, значение в ячейках которого будет меняться настроить MultiBinding через конвертор (пример писать лень, вот этот можете посмотреть). Конвертор будет получать два значения и выводить либо оригинальное значение из первого столбца, либо подменять его.

    27 октября 2016 г. 6:24
    Отвечающий