#wpf #datagrid #combobox
#wpf #datagrid #список со списком
Вопрос:
У меня проблема со списком wpf datagrid. У меня есть следующий код, в котором элементы не заполняются в combobox, пожалуйста, помогите мне, если кто-нибудь сделал это в wpf toolkit datagrid (НЕ в 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");
}
}
`
общедоступные данные dtUserResults = по умолчанию (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 amp;amp; 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
Комментарии:
1. Не могли бы вы добавить некоторый код вашей viewmodel, например: что такое ItemsSource?
Ответ №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
Комментарии:
1. OrderStatus — это List<строка> это правильный? Он находится в Viewmodel.
2. Хорошо, я понял. Проблема здесь в том, что вы должны знать, что когда вы применяете a
Binding
вDataGrid
столбце s, фактическимDataContext
является столбец DataGridItemSource
. Таким образом, он не найдет ваш списокOrderStatus
, потому что он находится в вашей ViewModel. Чтобы получить к нему доступ, воспользуйтесь предложением, которое я вам дал: добавьтеRelativeSource
, который будет заглядывать вDataGrid
родительскийDataContext
элемент и соответствующим образом находить правильный список 🙂3. @damascus: Все еще не работает, я изменил все, что вы упомянули выше: (Я также использовал относительный источник , но список по-прежнему не заполняется. правильно ли я использую list<string> или любой другой тип, который я должен использовать?
4. Где именно находится ваш
DataGrid
? вUserControl
илиWindow
?5. Кроме того, можете ли вы проверить, что отображается в окне вывода Visual Studio? Он должен выдать вам ошибку привязки, если не находит список