c# - WPF 数据网格 : How do I access a ComboBox in a specific row of a DataGridTemplateColumn?

标签 c# wpf xaml datagrid combobox

我的应用程序使用以下 XAML 代码正确地使用 ComboBox 填充 DataGrid 列:

<DataGridTemplateColumn Header="Thickness">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding SteelThickness, RelativeSource={RelativeSource AncestorType=Window}}" SelectedItem="{Binding BottomPlateThickness, UpdateSourceTrigger=PropertyChanged}" SelectionChanged="ComboBox_SelectionChanged" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我正在尝试找出一个表达式,例如

ComboBox cmb = dataGrid[i].Column[11].ComboBox

它将一次检索一个 ComboBox。

TIA

最佳答案

您好,在解决了您的问题后,我决定编写一个辅助类来通过索引访问行和列。我正在尝试给出一个想法。我还没有很好地测试过,所以可能存在一些问题。

Complete solution accessing datagrid row and column through indices

//该类将帮助通过索引获取行、列或单元格。虽然可能没有对 null 和索引进行适当的检查,对此抱歉。我稍后会更新。

    public static class DataGridExtension
{
    public static DataGridColumn GetColumnByIndices(this DataGrid dataGrid, int rowIndex, int columnIndex)
    {
        ValidateParameters(dataGrid, rowIndex, columnIndex);

        var row = dataGrid.GetRowByIndex(rowIndex);

        if (row != null)
            return row.GetRowColumnByIndex(columnIndex);

        return null;
    }

    public static DataGridCell GetCellByIndices(this DataGrid dataGrid, int rowIndex, int columnIndex)
    {
        ValidateParameters(dataGrid, rowIndex, columnIndex);

        var row = dataGrid.GetRowByIndex(rowIndex);

        if (row != null)
            return row.GetRowCellByColumnIndex(columnIndex);

        return null;
    }

    //TODO:Validate RowIndex
    public static DataGridRow GetRowByIndex(this DataGrid dataGrid, int rowIndex)
    {
        if (dataGrid == null)
            return null;

        return (DataGridRow)dataGrid.ItemContainerGenerator
                                                       .ContainerFromIndex(rowIndex);    
    }

    //TODO:Validate ColumnIndex
    public static DataGridColumn GetRowColumnByIndex(this DataGridRow row, int columnIndex)
    {
        if (row != null)
        {
            var cell=GetRowCellByColumnIndex(row, columnIndex);

            if(cell!=null)
                return cell.Column;
        }

        return null;
    }

    //TODO:Validate ColumnIndex
    public static DataGridCell GetRowCellByColumnIndex(this DataGridRow row, int columnIndex)
    {
        if (row != null)
        {
            DataGridCellsPresenter cellPresenter = row.GetVisualChild<DataGridCellsPresenter>();

            if (cellPresenter != null)
                return ((DataGridCell)cellPresenter.ItemContainerGenerator.ContainerFromIndex(columnIndex));
        }

        return null;
    }

    private static void ValidateParameters(DataGrid dataGrid,int rowIndex,int columnIndex)
    {
        if (dataGrid == null)
            throw new ArgumentNullException("datagrid is null");
        if (rowIndex >= dataGrid.Items.Count)
            throw new IndexOutOfRangeException("rowIndex out of Index");
        if (columnIndex >= dataGrid.Columns.Count)
            throw new IndexOutOfRangeException("columnIndex out of Index");
    }
}

****//这个类将帮助找到VisualChild ****

public static class VisualHelper
{
    public static T GetVisualChild<T>(this Visual parent) where T : Visual
    {
        T child = default(T);

        for (int index = 0; index < VisualTreeHelper.GetChildrenCount(parent); index++)
        {
            Visual visualChild = (Visual)VisualTreeHelper.GetChild(parent, index);
            child = visualChild as T;

            if (child == null)
                child = GetVisualChild<T>(visualChild);//Find Recursively

            if (child != null)
                break;
        }
        return child;
    }
}

现在您可以使用这些类按索引获取列、单元格、行

        private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        //Now we can get Column like this.
        var column = dataGrid.GetColumnByIndices(1, 1);

        //As SO want to find the ComboBox within that Column 
        ComboBox comboBox;
        var cell = dataGrid.GetCellByIndices(1, 1); //DataGridColumn Does'nt Inherit Visual class so using GetCellByIndices

        if(cell!=null)
            comboBox = cell.GetVisualChild<ComboBox>(); //DataGridCell Inherit Visual so we can use our VisualHelper Method
    }

关于c# - WPF 数据网格 : How do I access a ComboBox in a specific row of a DataGridTemplateColumn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20255343/

相关文章:

.net - ScrollViewer 不滚动

c# - NHibernate 错误 - "could not initialize a collection"

c# - Breeze 自定义操作

c# - 对所有 WPF 基本控件进行子类化

c# - DataBind到ObservableCollection,只显示某个派生类的元素

c# - 如果不同的属性发生变化,则订阅不同的属性事件

c# - 带有空字符串的 XAML 静态字符串数组

c# - 等待 100 毫秒以获取方法返回的数据 else throw exception

c# - 映射接口(interface)或抽象类组件

silverlight - XAML 转到绑定(bind)定义的 VisualState