如何将数据从MainWindow传递到MainWindow内部的用户控件?

时间:2018-11-26 02:46:44

标签: c# wpf xaml

我进行了研究,发现人们倾向于使用ViewModel来实现这一目标,但是我仍然陷于其中。

我有一个

public ObservableCollection<Order> orderList { get; set; } = new ObservableCollection<Order>();

MainWindow中已经充满了数据。

在MainWindow XAML中,我在TabControl内有一个用户控件:

<TabControl x:Name="TabCollection">
        <TabItem Header="UC1">
            <local:UserControl1/>
        </TabItem>
        <TabItem Header="UC2">
            <local:UserControl2/>
        </TabItem>
    </TabControl>

我们在这里只谈论UC1,因此在UC1 XAML中,我里面有一个ListView

    <UserControl.DataContext>
    <local:UserControl1VM/>
</UserControl.DataContext>

<ListView x:Name="ListViewText">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="First name" DisplayMemberBinding="{Binding Firstname}"/>
            <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding Lastname}"/>
            <GridViewColumn Header="Order" DisplayMemberBinding="{Binding Ordername}"/>
            <GridViewColumn Header="Delivery time" DisplayMemberBinding="{Binding Deliverytime}"/>
            <GridViewColumn Header="Phone Number" DisplayMemberBinding="{Binding Phone}"/>
            <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}"/>
            <GridViewColumn Header="Email" DisplayMemberBinding="{Binding Email}"/>
        </GridView>
    </ListView.View>
</ListView>

这是UserControl1VM.cs中的代码:

namespace QuickShop
{
class UserControl1VM : INotifyPropertyChanged
{
    private ObservableCollection<Order> orderList;
    public ObservableCollection<Order> OrderList
    {
        get { return orderList; }
        set
        {
            orderList = value;
            PropertyChanged(this, new PropertyChangedEventArgs("OrderList"));
        }
    }

    //
    private void FindDeliveryOrders(IEnumerable<Order> sortList)
    {
        foreach (var order in sortList)
        {
            if (order.Delivery.Equals("Yes"))
            {
                //deliveryOrders.Add(order);
                this.ListViewText.Items.Add(new Order { Firstname = order.Firstname, Lastname = order.Lastname, Ordername = order.Ordername, Deliverytime = order.Deliverytime, Phone = order.Phone, Address = order.Address, Email = order.Email });
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
}

当然,这些是不完整的代码,因为我不知道下一步如何进行。

我的目标只是填充ListView,如果orderList更改,它将自动更新。但是现在我什至不知道ViewModel是否正常工作,任何想法和代码演示都将不胜感激。

1 个答案:

答案 0 :(得分:1)

当您将UserControl分配给UserControl的XAML中的DataContext时,永远不要拥有“私有”视图模型。相反,它应该公开可以绑定到外部提供的视图模型对象的属性的依赖项属性。

像这样声明ItemsSource属性:

public partial class UserControl1 : UserControl
{
    public static readonly DependencyProperty ItemsSourceProperty =
        DependencyProperty.Register(
            nameof(ItemsSource), typeof(IEnumerable), typeof(UserControl1));

    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    public UserControl1()
    {
        InitializeComponent();
    }
}

并像这样绑定ListView:

<UserControl ...>
    ...
    <ListView ItemsSource="{Binding ItemsSource,
                            RelativeSource={RelativeSource AncestorType=UserControl}}">
        ...
    </ListView>
    ...
</UserControl>

使用UserControl时,将属性绑定到视图模型属性:

<TabItem Header="UC1">
    <local:UserControl1 ItemsSource="{Binding OrderList}"/>
</TabItem>

最后一个XAML代码段假定UserControl的DataContext中的对象具有OrderList属性。当TabControl绑定到具有该属性的视图模型对象的集合时,会自动发生这种情况。