【发布时间】:2016-08-20 13:26:57
【问题描述】:
我有这个 Order 类并且我正在使用 MVVM:
namespace drinksMVVM.Models
{
public class Order : INotifyPropertyChanged
{
private Item _OrderItem;
private ObservableCollection<Item> _Supplements;
private double _OrderPrice;
public Item OrderItem
{
get
{
return _OrderItem;
}
set
{
_OrderItem = value;
OnPropertyChanged("OrderItem");
_OrderPrice += _OrderItem.Price;
}
}
public ObservableCollection<Item> Supplements
{
get
{
return _Supplements;
}
set
{
_Supplements = value;
OnPropertyChanged("Supplements");
foreach(var supplement in _Supplements)
{
_OrderPrice += supplement.Price;
}
}
}
public double OrderPrice
{
get
{
return _OrderPrice;
}
set
{
_OrderPrice = value;
OnPropertyChanged("Price");
}
}
public Order()
{
}
public Order(Item item, ObservableCollection<Item> items)
{
_OrderItem = item;
_Supplements = items;
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
}
它包含 Item 类型的对象(属性名称和价格)和 Item 类型的 ObservableCollection。 Order 对象当然包含一个 Item,它是作为订单的单一食物/饮料,但可以包含 Item 和 ObservableCollection,它是一种带有额外补充的食物/饮料。
简单示例: 我订购了加糖和奶油的咖啡,我想向它们展示类似的东西: 咖啡(订单项) 糖+奶油(补充剂) 1,50(订单价格) 在这种情况下布局无关紧要
我的问题是如何在我的视图中显示数据。我有两个想法不知道如何继续。
-
带有文本块的 DataTemplate,每个文本块都绑定到 Order 类的属性,但不知道如何显示 ObservableCollection 中的每个项目名称。
<DataTemplate x:Key="OrderTemplate"> <StackPanel Orientation="Vertical"> <TextBlock x:Name="OrderName" Text="{Binding OrderItem.Name}"/> <TextBlock x:Name="OrderSupplements" Text="{Binding Supplements[0].Name}"/> ///Can't solve this binding <TextBlock x:Name="OrderPrce" Text="{Binding OrderPrice}"/> </StackPanel> </DataTemplate>
2.重写 Order 类的 ToString() 方法,以便在一个文本块中显示所有数据,但也找不到如何显示所有补充名称的解决方案。
public override string ToString()
{
return OrderItem.Name + " " +/*every single supplement name*/+" "
+OrderPrice.ToString();
}
和
<DataTemplate x:Key="OrderTemplate1">
<StackPanel Orientation="Vertical">
<TextBlock x:Name="test" Text="{Binding}"/>
</StackPanel>
</DataTemplate>
【问题讨论】:
-
你的问题太宽泛了,也缺少一个好的minimal reproducible example。通常,使用
ItemsControl或其子类之一(如ListBox)来显示像ObservableCollection<T>这样的集合。您可以改为使用IValueConverter将元素组合成一个字符串,但是您不会自动获得属性更改更新。请研究可用的技术并发布一个新问题,如果您可以提供一个好的minimal reproducible example 和一个关于如何实施您研究的技术的具体问题。 -
感谢您的评论。我目前正在阅读并试图了解 IValueConverter 的工作原理。我正在使用将元素组合成单个字符串的想法。 override 方法也有同样的想法。