【问题标题】:How to display data-Binding or Override ToString() C# WPF XAML如何显示数据绑定或覆盖 ToString() C# WPF XAML
【发布时间】: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(订单价格) 在这种情况下布局无关紧要

我的问题是如何在我的视图中显示数据。我有两个想法不知道如何继续。

  1. 带有文本块的 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&lt;T&gt; 这样的集合。您可以改为使用IValueConverter 将元素组合成一个字符串,但是您不会自动获得属性更改更新。请研究可用的技术并发布一个新问题,如果您可以提供一个好的minimal reproducible example 和一个关于如何实施您研究的技术的具体问题。
  • 感谢您的评论。我目前正在阅读并试图了解 IValueConverter 的工作原理。我正在使用将元素组合成单个字符串的想法。 override 方法也有同样的想法。

标签: c# wpf xaml mvvm


【解决方案1】:

就选项 #2 而言...

public override string ToString()
{
    string orderStr = string.Empty;
    orderStr += _OrderItem.Name + " ";

    foreach(Item supplement in Supplements)
    {
        orderStr += supplement.Name + " ";
    }

    orderStr += OrderPrice.ToString();
    return orderStr;
}

【讨论】:

  • 谢谢,它终于很好用了,我在 foreach 循环部分遇到了问题。
  • 不客气。感谢您提供帮助的机会!如果它对您有用,您能否将我的答案标记为已接受?干杯!
【解决方案2】:

我设法用 IValueConverter 解决了选项 #1

[ValueConversion(typeof(List<Item>),typeof(string))]
public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        List<Item> items = (List<Item>)value;
        string supplementsString = string.Empty;
        if (items.Count >= 1)
        {
            foreach (var item in items)
            {
                supplementsString += item.Name + " " + item.Price.ToString() + " " + Environment.NewLine;
            }
        }
        return supplementsString;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

还有 XAML 部分

<converters:MyConverter x:Key="MyConverterTest"/>

<TextBlock x:Name="OrderSupplements" 
     Text="{Binding Supplements, Converter={StaticResource MyConverter}}"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 2021-11-30
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多