Связанный DataGrid ItemSource возвращает нулевые или пустые объекты
Мой DataGrid
"s ItemSource
возвращает пустые объекты или ноль. В чем может быть дело? Все свойства связаны. При добавлении данных он отображается правильно в Grid, но при получении он дает ноль.
XML
<DataGrid AutoGenerateColumns="False" Grid.Row="2" Height="208" HorizontalAlignment="Left" Margin="20,71,0,0" Name="dgvWell" VerticalAlignment="Top" Width="528" HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible" BorderBrush="#FFB7B39D" Background="LightYellow" RowBackground="LightGray" AlternatingRowBackground="#FFFFFFF5" BorderThickness="10" CanUserReorderColumns="False" CanUserSortColumns="False" FontSize="13" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Layer Name" Width="80" Binding="{Binding LayerName}"/>
<DataGridTextColumn Width="100" Binding="{Binding Porosity}">
<DataGridTextColumn.Header>
<Grid Width="100">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="Porosity" Grid.Row="0"/>
<ComboBox Grid.Row="1" Width="70" HorizontalAlignment="Center" Name="cboPorosity">
<ComboBoxItem Content="pascal" IsSelected="True" />
<ComboBoxItem Content="psi"/>
<ComboBoxItem Content="bar"/>
<ComboBoxItem Content="barye"/>
</ComboBox>
</Grid>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Header="Permeability" Binding="{Binding Permeability}"/>
<DataGridTextColumn Width="120" Binding="{Binding Path= PerforationStartDepth,Mode=TwoWay}" ClipboardContentBinding="{Binding PerforationStartDepth}">
<DataGridTextColumn.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="Perforation Start" Grid.Row="0"/>
<ComboBox Grid.Row="1" Width="60" Name="cboPerfStart">
<ComboBoxItem Content="ft" IsSelected="True" />
<ComboBoxItem Content="M"/>
<ComboBoxItem Content="cm"/>
</ComboBox>
</Grid>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Width="145" Binding="{Binding PerforationEndDepth}">
<DataGridTextColumn.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="Perforation End" Grid.Row="0"/>
<ComboBox Grid.Row="1" Width="60" Name="cboPerfEnd">
<ComboBoxItem Content="ft" IsSelected="True"/>
<ComboBoxItem Content="M"/>
<ComboBoxItem Content="cm"/>
</ComboBox>
</Grid>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Width="140" Binding="{Binding ReservoirPressure,Mode=TwoWay}">
<DataGridTextColumn.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="Reservoir Pressure" Grid.Row="0"/>
<ComboBox Grid.Row="1" Width="60" Name="cboResPress">
<ComboBoxItem Content="pascal" IsSelected="True" />
<ComboBoxItem Content="psi"/>
<ComboBoxItem Content="bar"/>
<ComboBoxItem Content="barye"/>
</ComboBox>
</Grid>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Width="145" Header="Water Cut" Binding="{Binding WaterCut}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
Внутренний объект:
public struct Step2Data
{
public string LayerName { get; set; }
public int Porosity { get; set; }
public int Permeability { get; set; }
public int PerforationStartDepth { get; set; }
public int PerforationEndDepth { get; set; }
public int ReservoirPressure { get; set; }
public int WaterCut { get; set; }
}
List<Step2Data> step2datas = dgvWell.ItemsSource as List<Step2Data>;
Приведенный выше поиск возвращает ноль.
Можете ли вы помочь мне узнать, почему эта сетка не возвращает правильный ItemSource.
РЕДАКТИРОВАТЬ
На основании вашего примера, который мне очень помог, я реализовал свой код. На мой взгляд, у меня есть выпадающий список, который позволяет пользователю выбрать номер. Исходя из этого числа, в сетку добавляется столько строк. Я пытался работать над этим, но он не показывает никаких строк:
В моем классе Модель:
public ObservableCollection<Step2Model> Step2ModelList
{
get {
if (step2ModelList == null)
step2ModelList = new ObservableCollection<Step2Model>();
return step2ModelList;
}
set
{
step2ModelList = value;
Changed("Step2ModelList");
}
}
public void AddStep2ModelToList(Step2Model step2Model)
{
Step2ModelList.Add(step2Model);
}
public void addRowsToList(int count)
{
for (int i = 0; i < count; i++)
{
Step2ModelList.Add(new Step2Model()); // UPDATED
/*
AddItemCommand = new ActionCommand
{
ExecuteDelegate = o => Step2ModelList.Add(new Step2Model())
};
*/
}
}
DataGrid привязан к Step2ModelList
ItemsSource="{Binding Step2ModelList, Mode=TwoWay}">
На выбор поля со списком,
private void cboNumZones_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int num = (int)cboNumZones.SelectedItem;
Console.WriteLine("Numer of Zones SElected = " + num);
if (num > 0)
{
Step2InfoData st = this.DataContext as Step2InfoData;
st.addRowsToList(count);
}
}
После этого сетка не отражает 2 добавленные строки в Step2ModelList.
1 ответ
Я думаю, вы не понимаете концепцию DataGrid.ItemSource. Прочитайте http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.itemssource(v=vs.95).aspx
DataGrid.ItemSource используется для заполнения DataGrid, а не наоборот.
Если вы хотите получить доступ к элементам DataGrid, используйте:
dgvWell.Items;
Обновление, образец ObservableCollection:
ViewModel:
public class DataGridSampleViewModel
{
public ObservableCollection<Step2Data> Data { get; set; }
public ICommand AddItemCommand { get; set; }
public DataGridSampleViewModel()
{
Data = new ObservableCollection<Step2Data>();
AddItemCommand = new ActionCommand
{
ExecuteDelegate = o => Data.Add(new Step2Data { LayerName = DateTime.Now.Ticks.ToString() })
};
}
}
Посмотреть код за:
public partial class DataGridSampleView : Window
{
public DataGridSampleView()
{
InitializeComponent();
this.DataContext = new DataGridSampleViewModel();
}
}
Посмотреть:
<Window x:Class="SimpleMVVMApp.DataGridSampleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:simpleMvvmApp="clr-namespace:SimpleMVVMApp"
mc:Ignorable="d"
Title="DataGridSampleView" Height="300" Width="300"
d:DataContext="{d:DesignInstance simpleMvvmApp:DataGridSampleViewModel}">
<StackPanel>
<Button Content="Add new item" Command="{Binding AddItemCommand}" />
<ListBox ItemsSource="{Binding Data}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding LayerName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Window>
Полный исходный код можно найти по адресу https://github.com/mswietlicki/SimpleMVVMApp