Wpf DatagridTemplateColumn/Combobox不显示ItemsSource

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;

在我的ViewModel中,我有一个单元类的BindableCollection(使用Caliburn Micro)。Unit类有两个属性,UnitID(int)和UnitName(string)。此集合是DatagridTemplateColumn组合框的ItemsSource。我知道BindableCollection正在被填充,但是单位没有显示在组合框中,单位名称也没有显示在“From Unit”和“To Unit”列中

以下是我的ViewModel的重要部分:

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}}" />