Как передать данные из MainWindow в пользовательский элемент управления, который находится внутри MainWindow? - PullRequest
0 голосов
/ 26 ноября 2018

Я провел свое исследование, что люди склонны использовать 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 голосов
/ 26 ноября 2018

UserControl никогда не должен иметь «частную» модель представления, поскольку вы назначаете ее для DataContext в XAML UserControl.Вместо этого он должен предоставлять свойства зависимостей, которые могут быть связаны со свойствами предоставленного извне объекта модели представления.

Объявите свойство 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 предполагает, что объект в DataContext объекта UserControl имеет OrderList имущество.Это автоматически происходит, когда TabControl привязан к коллекции объектов модели представления с этим свойством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...