Редактируемый ComboBox в wpf datagrid

У меня проблема с комбинированным списком wpf datagrid. У меня есть следующий код, в котором элементы не заполняются в combobox, пожалуйста, помогите мне, если кто-то сделал это в datagrid инструментария wpf (НЕ в Infragistics), а также дайте мне знать, как сделать этот столбец combobox редактируемым?

  <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 = по умолчанию (список);

    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");
    }

`

Спасибо NallsKarthi


person nallskarthi    schedule 27.04.2011    source источник
comment
Не могли бы вы добавить код вашей модели просмотра, например: что такое ItemsSource?   -  person Damascus    schedule 27.04.2011


Ответы (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}" />

(если вы находитесь в окне, измените тип AncestorType на Window)

Конечно, здесь мне понадобится больше кода, особенно: объявление вашего ItemsSource и объявление OrderStatus

person Damascus    schedule 27.04.2011
comment
OrderStatus is List ‹string› это правильный? Это во Viewmodel. - person nallskarthi; 27.04.2011
comment
Хорошо, я понял. Проблема здесь в том, что вы должны знать, что когда вы применяете Binding в столбце DataGrid, фактический DataContext является ItemSource DataGrid. Таким образом, он не найдет ваш список OrderStatus, потому что он находится в вашей ViewModel. Чтобы получить к нему доступ, используйте предложение, которое я вам дал: добавление RelativeSource, которое будет смотреть в родительский элемент DataGrid DataContext и соответствующим образом находить правильный список :) - person Damascus; 27.04.2011
comment
@damascus: Все еще не работает, я изменил все, что вы упомянули выше :( Я также использовал Relative Source, но список все еще не заполняется. Правильно ли я использую список ‹string› или любой другой тип, который я должен использовать? - person nallskarthi; 27.04.2011
comment
Где именно находится ваш DataGrid? в UserControl или Window? - person Damascus; 27.04.2011
comment
Более того, можете ли вы проверить, что отображается в окне вывода Visual Studio? Он должен выдать вам ошибку привязки, если не найдет список - person Damascus; 27.04.2011
comment
Нет, он также не выдает никаких ошибок, и геттер ** get {} ** даже не вызывается в свойстве OrderStatus - person nallskarthi; 27.04.2011
comment
@damascus: он работает :) отлично, спасибо :) проблема в том, что я сделал Datagrid, поскольку non editable установил свойство IsReadonly = True, поэтому теперь я изменил значение на false < / b> это круто, спасибо :) - person nallskarthi; 27.04.2011