【发布时间】: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 的成员;它们是两个独立的类。我将编辑我的帖子以澄清这一点。