视图中没有刷新MVVM属性



我有以下视图模型类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using DOSTreeListModule.DataAdapter;
using WebApi2.SpaceDBData;
using Microsoft.Practices.Prism.Mvvm;
using Meijer.Merch.Shared.Infrastructure; 

namespace DOSTreeListModule.ViewModel
{
    public class DOSAdminProductHrcyViewModel : INotifyPropertyChanged
    {
        private readonly IWebApiDataAdapter _webAPIDataAdapter;
        public DOSAdminProductHrcyViewModel()
    {
        this._webAPIDataAdapter = new DosAdminDataAdapter();
        //this.ProductList = new Task<List<Product>>(this.GetProductList());
        //OnPropertyChanged("ProductList");
    }
    public List<Product> prdLst;
    public List<Product> ProductList
    {
        get
        {
            GetProductList();
            return prdLst;
        }
        set
        {
            ProductList = value;
        }
    }

    private async void GetProductList()
    {
        try
        {
            List<Product> dbProductList = new List<Product>();
            var result = await _webAPIDataAdapter.GetProductHierarchy();
            foreach (Product prd in result)
            {
                dbProductList.Add(prd);
            }
            this.prdLst = dbProductList;
            //return dbProductList;
            OnPropertyChanged("ProductList");
        }
        catch (Exception ex)
        {
            throw (ex);
        }
    }
        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }
}

下面是我在WPF中使用ProductList属性的视图中的TreeListControl:

<dxg:TreeListControl Name ="treeList" AutoGenerateColumns="AddNew" 
                             ItemsSource="{Binding ElementName=root, Path=ProductList.Result,Mode=TwoWay}"
                                 EnableSmartColumnsGeneration="True" RenderTransformOrigin="0.5,0.5" 
                                 Grid.ColumnSpan="2" Margin="0,0,0,0" Height="300">            
            <dxg:TreeListControl.Columns>
                <dxg:TreeListColumn FieldName="P_Hierarchy" Header="P_Hierarchy" />
                <dxg:TreeListColumn FieldName="COMBasis" Header="Compliance Basis" />
                <dxg:TreeListColumn FieldName="COMStandard" Header="Compliance Standard"/>
                <dxg:TreeListColumn FieldName="DOSBase" Header="DOS Standard Base" />
                <dxg:TreeListColumn FieldName="DOSStandard" Header="DOS Standard Promo" />
            </dxg:TreeListControl.Columns>
            <dxg:TreeListControl.View>
                <dxg:TreeListView Name="treeListView1" 
                                  TreeDerivationMode="Selfreference" KeyFieldName="ID" ParentFieldName="KeyID"
                                  ShowExpandButtons="False" AllowCascadeUpdate="True"
                                  ShowTotalSummary="True"/>
            </dxg:TreeListControl.View>
        </dxg:TreeListControl>

下面是我的View的代码:

namespace DOSTreeListModule.View
{
    /// <summary>
    /// Interaction logic for DosAdminProductHierarchy.xaml
    /// </summary>
    public partial class DosAdminProductHierarchy : UserControl
    {
        public DosAdminProductHierarchy(DOSAdminProductHrcyViewModel vm)
        {
            InitializeComponent();            
            this.DataContext = vm;
        }
    }
}

问题是我的TreeList控件没有被填充。虽然我在GetProductList()方法中获得数据(约7000行),但我没有看到前端的任何数据。请帮助。

看起来您绑定了错误的属性。您的ItemsSource应该绑定到视图模型中的ProductList:

ItemsSource="{Binding ElementName=root, Path=ProductList.Result,Mode=TwoWay}"
应:

ItemsSource="{Binding Path=ProductList}"

ItemsSource是在树中显示的项目。

首先将视图模型更新为更灵活一点

public class DOSAdminProductHrcyViewModel : INotifyPropertyChanged {
    private readonly IWebApiDataAdapter _webAPIDataAdapter;
    public DOSAdminProductHrcyViewModel() {
        this._webAPIDataAdapter = new DosAdminDataAdapter();
        ProductList = new ObservableCollection<Product>();
    }
    public ObservableCollection<Product> ProductList {get; set;}
    public async Task GetProductListAsync() {
        try {
            var result = await _webAPIDataAdapter.GetProductHierarchy();
            ProductList = new ObservableCollection<Product>(result);
            OnPropertyChanged("ProductList");    
        } catch (Exception ex) {
            throw (ex);
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName) {
        var handler = PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

现在在视图中(后面的代码)

public partial class DosAdminProductHierarchy : UserControl {
    DOSAdminProductHrcyViewMode viewModel;
    public DosAdminProductHierarchy(DOSAdminProductHrcyViewModel vm) {
        InitializeComponent();            
        this.viewModel = vm;
        this.DataContext = this.viewModel;
        this.Loaded += async delegate {
            await this.viewModel.GetProductListAsync();
        }      
    }
}
最后在view (XAML)中只绑定到集合
ItemsSource="{Binding Path=ProductList}"

根据我掌握的信息,我将尝试:

public List<Product> ProductList
    {
        get
        {
            GetProductList();
            return prdLst;
        }
        set
        {
            prdLst = value;
            OnPropertyChanged("ProductList");
        }
    }
 private async void GetProductList()
    {
        try
        {
            List<Product> dbProductList = new List<Product>();
            var result = await _webAPIDataAdapter.GetProductHierarchy();
            foreach (Product prd in result)
            {
                dbProductList.Add(prd);
            }
            if(this.prdLst != dbProductList)
                this.ProductList = dbProductList;
        }
        catch (Exception ex)
        {
            throw (ex);
        }
    }

ItemsSource="{Binding ElementName=YourWindowsName.DataContext, Path=ProductList,Mode=OneWay}"

最新更新