gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:52:04 27 4
gpt4 key购买 nike

我做了我的研究,人们倾向于使用 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 是否正常工作,任何想法和代码演示将不胜感激。

最佳答案

UserControl 永远不应具有“私有(private)” View 模型,因为您将它分配给 UserControl 的 XAML 中的 DataContext。它应该公开依赖属性,这些属性可以绑定(bind)到外部提供的 View 模型对象的属性。

像这样声明一个 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();
}
}

然后像这样绑定(bind) ListView:

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

当您使用 UserControl 时,将该属性绑定(bind)到 View 模型属性:

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

最后一个 XAML 片段假定 UserControl 的 DataContext 中的对象具有 OrderList 属性。当 TabControl 绑定(bind)到具有该属性的 View 模型对象集合时,这会自动发生。


或者,让 UserControl 的 XAML 中的元素直接绑定(bind)到继承的 DataContext 中对象的属性。

<UserControl ...>
...
<ListView ItemsSource="{Binding OrderList}">
...
</ListView>
...
</UserControl>

您的控件不必公开额外的可绑定(bind)属性,但它只适用于实际提供预期源属性的 DataContext 对象。

关于c# - 如何将数据从 MainWindow 传递到 MainWindow 内的用户控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53474161/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com