【问题标题】:Editable ComboBox in wpf datagridwpf数据网格中的可编辑组合框
【发布时间】:2011-08-13 15:58:39
【问题描述】:

我对 wpf datagrid 组合框有疑问。我有以下代码,其中项目未填充到组合框中,如果有人在 wpf 工具包数据网格(不在 Infragistics 中)中完成此操作,请帮助我,并让我知道如何使该组合框列成为可编辑的列?

  <DataGrid Name="dataGridResultsAdded" AutoGenerateColumns="False" FontWeight="Normal" IsReadOnly="True" ItemsSource="{Binding UserResults,Mode=Default}" SelectedIndex="{Binding SelectedIndexUserResults}" SelectionMode="Single" Margin="0,0,0,0" Height="178" GridLinesVisibility="None">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="RFC ID" Binding="{Binding RFCID}"></DataGridTextColumn>
                    <DataGridTextColumn Header="RFC Title" Binding="{Binding RFCTitle}"></DataGridTextColumn>
                    <DataGridTextColumn Header="RFC Revision" Binding="{Binding RFCRevision}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Trigger Association" Binding="{Binding TriggerAssociation}"></DataGridTextColumn>
                    <DataGridTemplateColumn Header="OrderStatus1" IsReadOnly="False">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Status, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBlock>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>

                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <ComboBox IsEditable="True" ItemsSource="{Binding Path=DataContext.OrderStatus,
                                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"                                           SelectedItem="{Binding Path=Status, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                    </DataGridTemplateColumn>
                    <DataGridComboBoxColumn IsReadOnly="False" Header="OrderStatus"  SelectedItemBinding="{Binding Status,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding OrderStatus, Mode=TwoWay}" />
                    <DataGridTextColumn Header="Status" Binding="{Binding TriggerStatus}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>

私有列表 orderStatus = default(List);

    public List<string> OrderStatus
    {
        get
        {
            if (orderStatus == null)
            {
                orderStatus = new List<string>();
                orderStatus.Add("None");
                orderStatus.Add("New");
                orderStatus.Add("Processing");
                orderStatus.Add("Shipped");
            }
            return orderStatus;
        }
        set
        {
            orderStatus = value;
            NotifyPropertyChanged("OrderStatus");
        }
    }

` public DataTable dtUserResults = default(DataTable);

    public DataTable UserResults
    {
        get
        {
            return dtUserResults;
        }
        set
        {
            dtUserResults = value;
            NotifyPropertyChanged("UserResults");
        }
    }

`查看下面的模型代码

    public void AddExecute()
    {
        InfoHandler.LogInfo("Entering AddExecute");
        try
        {
            DataTable dtUserRes = new DataTable();
            DataColumn dColumn = default(DataColumn);
            DataRow dRow = default(DataRow);

            DataRow dRowSelected = dtSearchResults.NewRow();
            dRowSelected = dtSearchResults.Rows[intSelectedIndexSearchRes];

            if (dtSearchResults.Rows.Count > 0 && IsRFCAlreadyAdded(dRowSelected))
            {
                dColumn = new DataColumn("RFCID", Type.GetType("System.String"));   
                dtUserRes.Columns.Add(dColumn);

                dColumn = new DataColumn("RFCTitle", Type.GetType("System.String"));
                dtUserRes.Columns.Add(dColumn);

                dColumn = new DataColumn("RFCRevision", Type.GetType("System.String"));
                dtUserRes.Columns.Add(dColumn);

                dColumn = new DataColumn("TriggerAssociation", Type.GetType("System.String"));
                dtUserRes.Columns.Add(dColumn);

                dColumn = new DataColumn("TriggerStatus", Type.GetType("System.String"));
                dtUserRes.Columns.Add(dColumn);

                //setting RFCID as primary key for the datatable UserResults
                dtUserRes.PrimaryKey = new DataColumn[] { dtUserRes.Columns[0] };

                dRow = dtUserRes.NewRow();
                dRow["RFCID"] = dRowSelected["RFCID"];
                dRow["RFCTitle"] = dRowSelected["RFCTitle"];
                dRow["RFCRevision"] = dRowSelected["RFCRevision"];
                dRow["TriggerAssociation"] = "Manual";
                dRow["TriggerStatus"] = "N";
                dtUserRes.Rows.Add(dRow);

                if (UserResults == null)
                {
                    UserResults = new DataTable();
                }
                UserResults.Merge(dtUserRes, true);

            }
        }
        catch (Exception objEx)
        {
            ErrorHandler.ShowErrorMessage(strErrorCaption, "Error occured while Adding RFC from Search results to Execution List", objEx.Message);
        }
        InfoHandler.LogInfo("Exiting AddExecute");
    }

`

谢谢 纳尔斯卡西

【问题讨论】:

  • 您能否添加一些视图模型的代码,例如:ItemsSource 是什么?

标签: wpf datagrid combobox


【解决方案1】:

这很正常,您不是要求ComboBox 填充许多值。

只要我正确理解你的问题,你就有

<ComboBox ItemsSource="{Binding Path=OrderStatus, Mode=TwoWay}" SelectedItem="{Binding Path=Status, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

OrderStatus 对象的类型是什么? 还有,OrderStatus在哪里?

我的建议是:

<ComboBox ItemsSource="{Binding Path=DataContext.OrderStatus,
  RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" 
  SelectedItem="{Binding Path=Status, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

(如果你在一个Window中,把AncestorType改为Window)

可以肯定的是,我需要更多代码,尤其是:您的 ItemsSource 的声明,以及 OrderStatus 的声明

【讨论】:

  • OrderStatus is List 是正确的吗?它在 Viewmodel 中。
  • 好的,我明白了。这里的问题是您必须知道,当您在DataGrid 的列中应用Binding 时,实际的DataContext 是DataGrid 的ItemSource。因此,它不会找到您的列表OrderStatus,因为它位于您的 ViewModel 中。要访问它,请使用我给你的建议:添加一个RelativeSource,它将查看DataGrid 的父DataContext,并适当地找到正确的列表:)
  • @damascus:仍然无法正常工作,我已经更改了您上面提到的任何内容:(我也使用了 Relative Source 但仍然列表没有被填充。这是正确的方式吗使用 list 或我应该使用的任何其他类型?
  • 您的DataGrid 到底在哪里?在UserControl 或Window 中?
  • 此外,您能检查一下 Visual Studio 的输出窗口上显示的内容吗?如果找不到列表,它应该会给你一个绑定错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 2013-11-03
  • 2015-08-16
相关资源
最近更新 更多