【问题标题】:DatagridTemplateColumn/Combobox not showing ItemsSourceDatagridTemplateColumn/Combobox 不显示 ItemsSource
【发布时间】:2014-07-27 23:14:19
【问题描述】:

在我的 ViewModel 中,我有一个 Unit 类的 BindableCollection(使用 Caliburn Micro)。 Unit 类有两个属性,UnitID (int) 和 UnitName (string)。此集合是 DatagridTemplateColumn 的 ComboBox 的 ItemsSource。我知道正在填充 BindableCollection,但 Units 没有显示在 ComboBox 中,UnitNames 也没有显示在“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)));
        }

这里是 Unit 和 UnitConversion 类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Vulcan.Entities
{
    public class Unit
    {
        private int _unitID;
        public int UnitID
        {
            get { return _unitID; }
            set { _unitID = value; }
        }

        private string _unitName;
        public string UnitName
        {
            get { return _unitName; }
            set { _unitName = value; }
        }

        public Unit(int unitID, string unitName)
        {
            this.UnitID = unitID;
            this.UnitName = unitName;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Vulcan.Entities
{
    public class UnitConversion
    {
        public int UnitConversionID { get; set; }

        public int FromUnitID { get; set; }
        public int ToUnitID { get; set; }

        //Ex. meters to millimeters: ConversionFactor = 1000, Offset = 0
        // Fahrenheit to Celsius: Conversion Factor = 0.5556, Offset = 17.7778
        public double ConversionFactor { get; set; }
        public double Offset { get; set; }

        public UnitConversion(int id, int fromUnit, int toUnit, double conversionFactor, double offset)
        {
            this.UnitConversionID = id;
            this.FromUnitID = fromUnit;
            this.ToUnitID = toUnit;
            this.ConversionFactor = conversionFactor;
            this.Offset = offset;
        }
    }
}

这是我当前的 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 集合显示在组合框中?

【问题讨论】:

  • 看起来你设置了错误的数据上下文。我不知道你的数据结构。所以你能提供你的代码吗?数据网格的 Itemsource 和 ItemsSource="{Binding Units}" units 是一个列表?
  • 数据网格的 itemssource 是 UnitConversions,一个 BindableCollection。组合框的 itemssource 是 Units,一个 BindableCollection。这两个集合都是 ViewModel 的公共属性。数据网格绑定 xaml 为
  • 所以,您的意思是 Units 是一个列表,它是 UnitConversions 的成员?我写了一个答案来方便地展示我的代码。
  • Units 和 UnitConversions 都是列表。 Units 不是 UnitConversions 的成员;它们是两个独立的类。我将编辑我的帖子以澄清这一点。

标签: wpf datagrid combobox


【解决方案1】:

我根据你的描述写了一些代码。

  <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; }
        }


    }

确保Units 是一个列表,并且该列表是UnitConversion Class 的成员。

【讨论】:

  • 感谢您的努力,Rang。但是,对于这个应用程序,我不能将 Units 作为 UnitConversionClass 的成员。
  • 我从 Rang 和 Martin 的回复中综合了答案,但我觉得我更多地使用了 Rang 的答案。您可以在blueshift777.wordpress.com/2014/07/28/… 看到我的解决方案
  • 如果Units不是UnitConversionClass的成员,你需要使用RelativeSource。在此之前,你了解datacontext和itemsource吗?我看到你的解决方案,我建议你应该使用RelativeSource来实现跨度>
【解决方案2】:

您确实有权访问 DataGrid 行中的 Units 集合。您只能访问 UnitConversion 类中的属性(即行所代表的类),要绑定到该集合,您需要执行以下操作:

<ComboBox DisplayMemberPath="UnitName" 
          SelectedValuePath="UnitID" 
          SelectedValue="{Binding Path=FromUnitID}"
          ItemsSource="{Binding DataContext.Units, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" />

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2019-09-11
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多