如何将 ObservableCollection 绑定到 ListView?
How to bind ObservableCollection to ListView?
我创建了一个 ObservableCollection 来使用 entity framework 从数据库中填充 ListViev。当我调用 fill 方法时,我最终会无休止地尝试填充集合。我有一个模型 Device_compiexity 和 Device_category,它们由 device_complexity_id 关联。我为他们创建了 VievModel,并在此基础上创建了一个已填充的集合。
我的视图模型:
class DeviceCategoryViewModel
{
TechDContext dc = new TechDContext();
public int Device_category_id { get; set; }
public string Сategory_name { get; set; }
public int Device_complexity_id { get; set; }
public string Device_complexity_name { get; set; }
public static DeviceCategoryViewModel DeviceCaterogyVM(DeviceCategory deviceCategory, DeviceComplexity deviceComplexity)
{
return new DeviceCategoryViewModel
{
Device_category_id = deviceCategory.Device_category_id,
Сategory_name = deviceCategory.Category_name,
Device_complexity_id = deviceCategory.Device_complexity_id,
Device_complexity_name = deviceComplexity.Device_complexity_name,
};
}
public DeviceCategoryViewModel()
{
FillDeviceCategories();
}
public void FillDeviceCategories()
{
using (TechDContext dc = new TechDContext())
{
var q = from cat in dc.DeviceCategories
join com in dc.DeviceComplexities on cat.Device_complexity_id equals com.Device_complexity_id
select new DeviceCategoryViewModel
{
Device_category_id = cat.Device_category_id,
Сategory_name = cat.Category_name,
Device_complexity_id = com.Device_complexity_id,
Device_complexity_name = com.Device_complexity_name
};
deviceCategories = new ObservableCollection<DeviceCategoryViewModel>(q);
}
}
private ObservableCollection<DeviceCategoryViewModel> deviceCategories;
public ObservableCollection<DeviceCategoryViewModel> DeviceCategories
{
get
{
return deviceCategories;
}
}
private static DeviceCategoryViewModel selectedDeviceCategory;
public DeviceCategoryViewModel SelectedDeviceCategory
{
get
{
return selectedDeviceCategory;
}
set
{
selectedDeviceCategory = value;
}
}
}
在 window 的初始化中,我这样做:
DeviceCategoriesPanel.DataContext = new DeviceCategoryViewModel();
在 XAML 我这样做:
<Grid HorizontalAlignment="Left" Height="447" x:Name="DeviceCategoriesPanel" Margin="392,2,0,0" VerticalAlignment="Top" Width="392">
<Label x:Name="label1_Copy2" Content="Категории устройств" HorizontalAlignment="Left" Margin="10,0,0,410" VerticalAlignment="Bottom" FontWeight="Bold" Width="188" FontSize="14"/>
<ListView x:Name="categoriesComponentsLV" HorizontalAlignment="Right" MaxHeight="200" MinHeight="150" Margin="0,44,10,0" Grid.Column="0" ItemsSource="{Binding DeviceCategories}" SelectedItem="{Binding SelectedDeviceCategory}" VerticalAlignment="Top" Width="372" Height="197">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="5">
<TextBlock FontSize="18" Text="{Binding Path=Category_name}" />
<TextBlock Text="{Binding Path=Device_complexity_name}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
当您新建每个设备类别视图模型时:
select new DeviceCategoryViewModel
{
它的构造函数将运行。
它的构造函数是做什么的?
public DeviceCategoryViewModel()
{
FillDeviceCategories();
}
那是你的问题。
因为 FillDeviceCategories 中有 linq,它会依次为它找到的每个调用 FillDeviceCategories...。这又会调用 FillDevicategories...可能不会无休止,因为您最终会堆栈溢出或一些令人讨厌的事情。
我创建了一个 ObservableCollection 来使用 entity framework 从数据库中填充 ListViev。当我调用 fill 方法时,我最终会无休止地尝试填充集合。我有一个模型 Device_compiexity 和 Device_category,它们由 device_complexity_id 关联。我为他们创建了 VievModel,并在此基础上创建了一个已填充的集合。
我的视图模型:
class DeviceCategoryViewModel
{
TechDContext dc = new TechDContext();
public int Device_category_id { get; set; }
public string Сategory_name { get; set; }
public int Device_complexity_id { get; set; }
public string Device_complexity_name { get; set; }
public static DeviceCategoryViewModel DeviceCaterogyVM(DeviceCategory deviceCategory, DeviceComplexity deviceComplexity)
{
return new DeviceCategoryViewModel
{
Device_category_id = deviceCategory.Device_category_id,
Сategory_name = deviceCategory.Category_name,
Device_complexity_id = deviceCategory.Device_complexity_id,
Device_complexity_name = deviceComplexity.Device_complexity_name,
};
}
public DeviceCategoryViewModel()
{
FillDeviceCategories();
}
public void FillDeviceCategories()
{
using (TechDContext dc = new TechDContext())
{
var q = from cat in dc.DeviceCategories
join com in dc.DeviceComplexities on cat.Device_complexity_id equals com.Device_complexity_id
select new DeviceCategoryViewModel
{
Device_category_id = cat.Device_category_id,
Сategory_name = cat.Category_name,
Device_complexity_id = com.Device_complexity_id,
Device_complexity_name = com.Device_complexity_name
};
deviceCategories = new ObservableCollection<DeviceCategoryViewModel>(q);
}
}
private ObservableCollection<DeviceCategoryViewModel> deviceCategories;
public ObservableCollection<DeviceCategoryViewModel> DeviceCategories
{
get
{
return deviceCategories;
}
}
private static DeviceCategoryViewModel selectedDeviceCategory;
public DeviceCategoryViewModel SelectedDeviceCategory
{
get
{
return selectedDeviceCategory;
}
set
{
selectedDeviceCategory = value;
}
}
}
在 window 的初始化中,我这样做:
DeviceCategoriesPanel.DataContext = new DeviceCategoryViewModel();
在 XAML 我这样做:
<Grid HorizontalAlignment="Left" Height="447" x:Name="DeviceCategoriesPanel" Margin="392,2,0,0" VerticalAlignment="Top" Width="392">
<Label x:Name="label1_Copy2" Content="Категории устройств" HorizontalAlignment="Left" Margin="10,0,0,410" VerticalAlignment="Bottom" FontWeight="Bold" Width="188" FontSize="14"/>
<ListView x:Name="categoriesComponentsLV" HorizontalAlignment="Right" MaxHeight="200" MinHeight="150" Margin="0,44,10,0" Grid.Column="0" ItemsSource="{Binding DeviceCategories}" SelectedItem="{Binding SelectedDeviceCategory}" VerticalAlignment="Top" Width="372" Height="197">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="5">
<TextBlock FontSize="18" Text="{Binding Path=Category_name}" />
<TextBlock Text="{Binding Path=Device_complexity_name}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
当您新建每个设备类别视图模型时:
select new DeviceCategoryViewModel
{
它的构造函数将运行。 它的构造函数是做什么的?
public DeviceCategoryViewModel()
{
FillDeviceCategories();
}
那是你的问题。
因为 FillDeviceCategories 中有 linq,它会依次为它找到的每个调用 FillDeviceCategories...。这又会调用 FillDevicategories...可能不会无休止,因为您最终会堆栈溢出或一些令人讨厌的事情。