代码之家  ›  专栏  ›  技术社区  ›  Sharun

wpfdatagrid:以编程方式编辑单元格

  •  3
  • Sharun  · 技术社区  · 16 年前

    我有一个单元格,需要设置它的值,只要点击它。它对不同的属性是多重绑定的。

    我应该在哪里做这个?我一直试图在datagrid beginingedit处理程序中这样做(但没有取得太大成功)。我可以手动单击两次(一次选择单元格,然后开始编辑),然后设置值。但我想用编程的方式。。。

    private void MyDataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
    
    TextBlock t = e.EditingEventArgs.OriginalSource as TextBlock;
    if (t == null) return;
    t.Text = SimulatedEdit();
    
    // All this below is just me trying different thing. Not sure what I need to be doing
    e.EditingEventArgs.Handled = true;
    MyDataGrid.CommitEdit();
    MyDataGrid.UnselectAllCells();
    }
    

    这就是columntemplate的设置方式

    MultiBinding tempmb = new MultiBinding();
    Binding tempXB = new Binding("X");
    Binding temptYB = new Binding("Y");
    tempmb.Bindings.Add(tempXB);
    tempmb.Bindings.Add(temptYB);
    tempmb.ConverterParameter = "ggrid";
    tempmb.Converter = new LabelDecider();
    
                DataGridTemplateColumn dgtc = new DataGridTemplateColumn
                {
                    Header = "blah",  CanUserSort = false, CanUserReorder = false,
                };
                DataTemplate t = new DataTemplate();
                FrameworkElementFactory f = new FrameworkElementFactory(typeof(TextBlock));
                f.SetBinding(TextBlock.TextProperty, tempmb);
    
                // Setup background color binding
                MultiBinding colorb = new MultiBinding();
                colorb.Bindings.Add(tempX);
                colorb.Bindings.Add(tempY);
                colorb.ConverterParameter = "color";
                colorb.Converter = new LabelDecider();
                f.SetBinding(TextBlock.BackgroundProperty, colorb);
                t.VisualTree = f;
                //Every columns Text and Background are using bindings
                dgtc.CellTemplate = t;
    
                //setup editing template
                DataTemplate ced = new DataTemplate();
                FrameworkElementFactory f2 = new FrameworkElementFactory(typeof(TextBox));
                MultiBinding tempmb2 = new MultiBinding();
                tempmb2.Bindings.Add(tempXB);
                tempmb2.Bindings.Add(tempYB);
                tempmb2.Mode = BindingMode.TwoWay;
                tempmb2.ConverterParameter = "ggrid";
                tempmb2.Converter = new LabelDecider(rDestination.Recievers[k]);
    
                tempmb2.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus;
                f2.SetBinding(TextBox.TextProperty, tempmb2);
                ced.VisualTree = f2;
                dgtc.CellEditingTemplate = ced;
    
                MyDataGrid.Columns.Add(dgtc);
    
    1 回复  |  直到 16 年前
        1
  •  9
  •   Community Mohan Dere    9 年前

    不确定我是否正确理解您的问题;看起来您希望以编程方式访问和更改DataGridCell内容。请检查下面的一个例子;我在datagrid中添加了一个SelectedCellsChanged偶数处理程序,每次选择新单元格时都会触发它;有了DataGridCellInfo对象,您可以访问DataGridCell对象并更改其内容。

    private void dataGrid1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        foreach (DataGridCellInfo cellInfo in dataGrid1.SelectedCells)
        {
            // this changes the cell's content not the data item behind it
            DataGridCell gridCell = TryToFindGridCell(dataGrid1, cellInfo);
            if (gridCell!=null) gridCell.Content = "changed!!!"; 
        }
    }
    
    static DataGridCell TryToFindGridCell(DataGrid grid, DataGridCellInfo cellInfo)
    {
        DataGridCell result = null;
        DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(cellInfo.Item);
        if (row!=null)
        {
            int columnIndex = grid.Columns.IndexOf(cellInfo.Column);
            if (columnIndex>-1)
            {
                DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
                result = presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell;
            }
        }
        return result;
    }
    
    static 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;
    }
    

    here

    希望这对你有帮助,你也可以看看 BeginEdit of a specific Cell from code behind

    当做