C# 如何将数据从主窗口传递到';主窗口里有什么?

C# 如何将数据从主窗口传递到';主窗口里有什么?,c#,wpf,xaml,C#,Wpf,Xaml,我做了一项研究,人们倾向于使用ViewModel来实现这一点,但我有点陷入其中 我有一个 public observetecollection orderList{get;set;}=new observetecollection() 在main窗口中,该窗口已填充数据 在主窗口XAML中,我在选项卡Control中有一个用户控件: <TabControl x:Name="TabCollection"> <TabItem Header="UC1">

我做了一项研究,人们倾向于使用ViewModel来实现这一点,但我有点陷入其中

我有一个

public observetecollection orderList{get;set;}=new observetecollection()

main窗口中
,该窗口已填充数据

在主窗口XAML中,我在
选项卡Control
中有一个用户控件:

<TabControl x:Name="TabCollection">
        <TabItem Header="UC1">
            <local:UserControl1/>
        </TabItem>
        <TabItem Header="UC2">
            <local:UserControl2/>
        </TabItem>
    </TabControl>
下面是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 { };
}
}
命名空间QuickShop
{
类UserControl1VM:INotifyPropertyChanged
{
私有可观察收集订单列表;
公共可观察收集订单列表
{
获取{返回订单列表;}
设置
{
orderList=值;
PropertyChanged(这是新的PropertyChangedEventArgs(“订单列表”);
}
}
//
私人无效查找传送者(IEnumerable sortList)
{
foreach(排序列表中的变量顺序)
{
如果(订单交付等于(“是”))
{
//deliveryOrders.Add(订单);
this.ListViewText.Items.Add(新订单{Firstname=Order.Firstname,Lastname=Order.Lastname,Ordername=Order.Ordername,Deliverytime=Order.Deliverytime,Phone=Order.Phone,Address=Order.Address,Email=Order.Email});
}
}
}
公共事件PropertyChangedEventHandler PropertyChanged=委托{};
}
}
当然,这些都是不完整的代码,因为我不知道下一步该怎么做


我的目标只是填充
列表视图
,如果
订单列表
发生更改,它将自动更新自身。但是现在我甚至不知道ViewModel是否正常工作,任何想法和代码演示都将不胜感激。

用户控件永远不应该有“私有”视图模型,因为您将其分配给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();
    }
}
<UserControl ...>
    ...
    <ListView ItemsSource="{Binding ItemsSource,
                            RelativeSource={RelativeSource AncestorType=UserControl}}">
        ...
    </ListView>
    ...
</UserControl>
并按如下方式绑定ListView:

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();
    }
}
<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绑定到具有该属性的视图模型对象集合时,会自动发生这种情况。

无需在
main窗口中获取
public observateCollection orderList
。在
UserControl1VM
@GaurangDave中定义并实现它,但通过这样做,我必须将填充
orderList
的整个方法移动到
UserControl1VM
中,这是正确的!我认为这将是MVVM的正确实现。您需要将相关VM与其视图分开。@GaurangDave那么为什么我需要ViewModel?我可以在自动生成的UserControl1.xaml.cs中实现它(因为该方法调用SQL数据库来读取数据并填充
orderList
,所以它有些独立)Usercontrol将显示一个列表,然后根据我的说法,最好的结构是在Usercontrol中连接sql并在那里执行所有与用户控件相关的操作。看,这是编程,您可以使用任何流和结构完成任何任务,但一旦您的应用程序增长,您可能会发现管理代码更改很困难。