Wpf DatagridTemplateColumn/Combobox不显示ItemsSource
在我的ViewModel中,我有一个单元类的BindableCollection(使用Caliburn Micro)。Unit类有两个属性,UnitID(int)和UnitName(string)。此集合是DatagridTemplateColumn组合框的ItemsSource。我知道BindableCollection正在被填充,但是单位没有显示在组合框中,单位名称也没有显示在“From Unit”和“To Unit”列中 以下是我的ViewModel的重要部分:Wpf DatagridTemplateColumn/Combobox不显示ItemsSource,wpf,datagrid,combobox,Wpf,Datagrid,Combobox,在我的ViewModel中,我有一个单元类的BindableCollection(使用Caliburn Micro)。Unit类有两个属性,UnitID(int)和UnitName(string)。此集合是DatagridTemplateColumn组合框的ItemsSource。我知道BindableCollection正在被填充,但是单位没有显示在组合框中,单位名称也没有显示在“From Unit”和“To Unit”列中 以下是我的ViewModel的重要部分: using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Vulcan.Entities;
using Vulcan.Conduits;
using Caliburn.Micro;
namespace Vulcan.ViewModels
{
public class EditUnitConversionsViewModel : Screen, IActiveContentViewModel
{
IUnitConversionConduit _conversionConduit;
IUnitConduit _unitConduit;
EventAggregator _eventAggregator;
public BindableCollection<UnitConversion> UnitConversions { get; set; }
public int SelectedConversionIndex { get; set; }
public BindableCollection<Unit> Units { get; set; }
public int SelectedFromUnitIndex { get; set; }
public int SelectedToUnitIndex { get; set; }
public EditUnitConversionsViewModel(IUnitConversionConduit conversionConduit, IUnitConduit unitConduit, EventAggregator agg)
{
_conversionConduit = conversionConduit;
_unitConduit = unitConduit;
_eventAggregator = agg;
Units = new BindableCollection<Unit>(_unitConduit.GetUnits());
UnitConversions = new BindableCollection<UnitConversion>(_conversionConduit.GetUnitConversions().Select(c => new UnitConversion(c, _unitConduit)));
}
以下是我当前的XAML:
<DataGrid.Columns>
<DataGridTemplateColumn Header="From Unit" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="UnitName" SelectedValuePath="UnitID"
SelectedValue="{Binding Path=FromUnitID}"
ItemsSource="{Binding Path=Units}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="To Unit" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="UnitName" SelectedValuePath="UnitID"
SelectedValue="{Binding Path=ToUnitID}"
ItemsSource="{Binding Units}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Conversion Factor" Binding="{Binding ConversionFactor}" Width="*" />
<DataGridTextColumn Header="Offset" Binding="{Binding Offset}" Width="*" />
以下是DataGrid的屏幕截图:
我需要在XAML中更改什么才能使Units集合显示在组合框中?我根据您的描述编写了一些代码
<DataGrid x:Name="dg" ItemsSource="{Binding LstUnitC}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="From Unit" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="UnitName" ItemsSource="{Binding Units}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
背景:
private List<UnitConversions> lstunitc;
public List<UnitConversions> LstUnitC
{
get { return lstunitc; }
set { lstunitc = value; }
}
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
List<Units> lstunit = new List<Units>();
Units u = new Units();
u.UnitName = "asd";
lstunit.Add(u);
u = new Units();
u.UnitName = "asd1";
lstunit.Add(u);
LstUnitC = new List<UnitConversions>();
UnitConversions uc = new UnitConversions();
uc.Units = lstunit;
LstUnitC.Add(uc);
dg.ItemsSource = LstUnitC;
}
}
public class Units
{
private string _UnitName;
public string UnitName
{
get { return _UnitName; }
set { _UnitName = value; }
}
}
public class UnitConversions
{
private List<Units> units;
public List<Units> Units
{
get { return units; }
set { units = value; }
}
}
私有列表lstunc;
公共名单
{
获取{return lstunc;}
设置{lstunc=value;}
}
公共主窗口()
{
初始化组件();
this.DataContext=this;
List lstune=新列表();
单位u=新单位();
u、 UnitName=“asd”;
1.增加(u);
u=新单位();
u、 UnitName=“asd1”;
1.增加(u);
LstUnitC=新列表();
UnitConversions uc=新的UnitConversions();
uc.单位=1个单位;
lstunc.Add(uc);
dg.ItemsSource=lstunc;
}
}
公营单位
{
私有字符串_UnitName;
公共字符串单位名
{
获取{return\u UnitName;}
设置{u UnitName=value;}
}
}
公共类单位转换
{
私人名单单位;
公开名单单位
{
获取{返回单位;}
设置{units=value;}
}
}
确保
Units
是一个列表,并且该列表是UnitConversion类的成员
您确实可以访问DataGrid行中的Units集合。您只能访问UnitConversion类(即行表示的类)中的属性,要绑定到该集合,您需要执行以下操作:
<ComboBox DisplayMemberPath="UnitName"
SelectedValuePath="UnitID"
SelectedValue="{Binding Path=FromUnitID}"
ItemsSource="{Binding DataContext.Units, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" />
看起来您设置了错误的数据上下文。我不知道您的数据结构。因此,您能提供您的代码吗?datagrid的Itemsource和ItemsSource=“{Binding Units}”
Units是一个列表?datagrid的ItemsSource是UnitConversions,一个BindableCollection。组合框的itemssource是Units,一个BindableCollection。这两个集合都是ViewModel的公共属性。datagrid绑定xaml是。那么,你是说Units是一个列表,它是UnitConversions的成员?我写了一个答案来方便地显示我的代码。单位和单位转换都是列表。Units不是UnitConversions的成员;他们是两个独立的班级。我将编辑我的帖子来澄清这一点。谢谢你的努力,雷恩。但是,对于这个应用程序,我不能将Units作为UnitConversionClass的成员。我综合了Rang和Martin的回答,但我觉得我使用了Rang更多的答案。如果Units不是UnitConversionClass的成员,您可以在上看到我的解决方案,您需要使用RelativeSource。在此之前,您了解datacontext和itemsource吗?我已经看到了您的解决方案,建议您使用RelativeSource实现它
<ComboBox DisplayMemberPath="UnitName"
SelectedValuePath="UnitID"
SelectedValue="{Binding Path=FromUnitID}"
ItemsSource="{Binding DataContext.Units, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" />