C# 数据模板的绑定模型和视图模型

C# 数据模板的绑定模型和视图模型,c#,wpf,mvvm,C#,Wpf,Mvvm,我对WPF比较陌生,我尝试在列表视图中显示一些数据 我有一个模型类Order,我只想在列表视图上显示它。但我还想显示一些其他计算信息(例如订单中位置的数量) 如何实现对列表视图的数据模板使用OrderViewModel(ViewModel)而不是Order(Model)类 如果你需要更多的信息,请告诉我 提前谢谢你 订单类别 这是我的订单课。它包含一些信息,但不是我想在ListView上显示的所有信息 public class Order { private int number;

我对WPF比较陌生,我尝试在
列表视图中显示一些数据

我有一个模型类
Order
,我只想在
列表视图上显示它。但我还想显示一些其他计算信息(例如订单中
位置的数量)

如何实现对
列表视图的
数据模板
使用
OrderViewModel
(ViewModel)而不是
Order
(Model)类

如果你需要更多的信息,请告诉我

提前谢谢你

订单类别

这是我的订单课。它包含一些信息,但不是我想在ListView上显示的所有信息

public class Order
{
    private int number;
    private ObservableCollection<Position> positions;


    /// <summary>
    /// Default Constructor
    /// </summary>
    public Order()
    {
        this.positions = new ObservableCollection<Position>();
    }

    /// <summary>
    /// Order Number
    /// </summary>
    public int Number
    {
        get { return number; }
        set { number = value; }
    }

    /// <summary>
    /// Positions inside the order.
    /// </summary>
    public ObservableCollection<Position> Positions
    {
        get { return positions; }
        set { positions = value; }
    }
}
public class OrderViewModel : ViewModelBase
{
    readonly private Order order;

    #region Constructor

    public OrderViewModel(Order order)
    {
        this.order = order;
    }

    #endregion Constructor

    #region Order Properties

    public string Number
    {
        get { return order.Number.ToString(); }
    }

    public ObservableCollection<Position> Positions
    {
        get
        {
            return order.Positions;
        }
    }

    #endregion Order Properties

    #region Presentation Properties

    public int AmountOfPositions // Calculated value should be shown on the ListView.
    {
        get { return order.Positions.Count; }
    }

    #endregion Presentation Properties
}
公共类秩序
{
私有整数;
私人可观测收集位置;
/// 
///默认构造函数
/// 
公共秩序()
{
this.positions=新的ObservableCollection();
}
/// 
///订单号
/// 
公共整数
{
获取{返回编号;}
设置{number=value;}
}
/// 
///订单中的位置。
/// 
公众可观察的集合位置
{
获取{返回位置;}
设置{positions=value;}
}
}
订单视图模型

这个类是我想在ListView上显示的ViewModel

public class Order
{
    private int number;
    private ObservableCollection<Position> positions;


    /// <summary>
    /// Default Constructor
    /// </summary>
    public Order()
    {
        this.positions = new ObservableCollection<Position>();
    }

    /// <summary>
    /// Order Number
    /// </summary>
    public int Number
    {
        get { return number; }
        set { number = value; }
    }

    /// <summary>
    /// Positions inside the order.
    /// </summary>
    public ObservableCollection<Position> Positions
    {
        get { return positions; }
        set { positions = value; }
    }
}
public class OrderViewModel : ViewModelBase
{
    readonly private Order order;

    #region Constructor

    public OrderViewModel(Order order)
    {
        this.order = order;
    }

    #endregion Constructor

    #region Order Properties

    public string Number
    {
        get { return order.Number.ToString(); }
    }

    public ObservableCollection<Position> Positions
    {
        get
        {
            return order.Positions;
        }
    }

    #endregion Order Properties

    #region Presentation Properties

    public int AmountOfPositions // Calculated value should be shown on the ListView.
    {
        get { return order.Positions.Count; }
    }

    #endregion Presentation Properties
}
公共类OrderViewModel:ViewModelBase { 只读私人订单; #区域构造函数 公共订单视图模型(订单) { 这个。顺序=顺序; } #端域构造函数 #区域顺序属性 公共字符串号 { 获取{return order.Number.ToString();} } 公众可观察的集合位置 { 收到 { 退货订单。位置; } } #端域顺序属性 #区域表示属性 public int AmountOfPositions//计算值应显示在ListView上。 { 获取{return order.Positions.Count;} } #端域表示属性 }
ListView的XAML

  <ListView x:Name="orderListView" ItemsSource="{Binding Path=AvailableOrders}" Margin="0,54,0,0" SelectionMode="Single" 
              SelectedItem="{Binding Path=SelectedOrder}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Number}" />
                    <TextBlock Text="{Binding AmountOfPositions}" // This does not work! />
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

  • 您需要将您的XAML复制到viewmodel
  • 您需要创建最终通过ViewModelBase公开的事件

  • 我想..在properties中添加get以及set和RaisePropertyChange,以便在viewwhat type is AvailableOrders上通知它。@JustinCI我无法绑定属性AmountOffices,因为Model类没有该属性。ListView直接使用模型,而不是ModelView(OrderViewModel)@y0io它的类型是Order。您认为我必须使用列表中的ViewModel吗?当我使用类顺序时,是否有一种方法可以“自动”使用ViewModel?@JustinCI是的,当然,在集合中使用ViewModel:)这是一种常见的方法