C# WPF中项目的绑定列表

C# WPF中项目的绑定列表,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,我试图实现MVVM。视图中的文本框文本绑定到模型中的属性itemName 在视图上是DataGrid->绑定到ViewModel.Rows属性 在ViewModel on itemName on change事件中,对产品的远程服务运行异步请求,该请求转到model SugestProducts属性。SugestProducts属性是ListView项的源 如果产品超过0,则打开listview。ListView SelectedItem绑定到模型产品属性 我需要在列表视图中选择产品,从prod

我试图实现MVVM。视图中的文本框文本绑定到模型中的属性itemName

在视图上是DataGrid->绑定到ViewModel.Rows属性

在ViewModel on itemName on change事件中,对产品的远程服务运行异步请求,该请求转到model SugestProducts属性。SugestProducts属性是ListView项的源

如果产品超过0,则打开listview。ListView SelectedItem绑定到模型产品属性

我需要在列表视图中选择产品,从product.name属性中填充itemName属性,而无需请求远程服务。其他工作很好

我的模型是:

public class RowDocumentSaleWraper : INotifyPropertyChanged
{
    private ObservableCollection<Product> _sugestProducts;
    public ObservableCollection<Product> SugestProducts 
    { 
        get
        {
            return _sugestProducts;
        }
        set
        {
            _sugestProducts = value;
            NotifyPropertyChanged("SugestProducts");
        }
    }

        public Product product {get; set;}
         _itemName
        public override string itemName
        {
            get
            {
                return itemName;
            }
            set
            {
                itemName = value;
                NotifyPropertyChanged("itemName");
            }
        }  
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
}
我的ViewModel是:

public class OrderViewModel : DependencyObject
{
       public ObservableCollection<RowDocumentSaleWraper> Rows { get; set; }

    public OrderViewModel()
    {
        addNewRow();
    }
        internal void addNewRow()
        {
            RowDocumentSaleWraper row = new RowDocumentSaleWraper(Order);
            row.PropertyChanged += row_PropertyChanged;
            Rows.Add(row);
        }
    void row_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        RowDocumentSaleWraper row = sender as RowDocumentSaleWraper;

        if (row != null && e.PropertyName == "itemName" && !String.IsNullOrEmpty(row.itemName))
        {
            //get products from remote service -> source for 
            requestProducts(row.itemName, row);
        }
    }
    private async void requestProducts(string searchString, RowDocumentSaleWraper row)
    {
        if (!String.IsNullOrEmpty(searchString))
        {
            var products = await requestProductsAsync(searchString);

            row.SugestProducts = listToObservable(products);
        }

    }
}

公共类OrderViewModel:DependencyObject { 公共ObservableCollection行{get;set;} public OrderViewModel() { addNewRow(); } 内部void addNewRow() { RowDocumentSaleWraper行=新的RowDocumentSaleWraper(订单); row.PropertyChanged+=row_PropertyChanged; 行。添加(行); } 无效行\u PropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e) { RowDocumentSaleWraper行=发件人为RowDocumentSaleWraper; if(row!=null&&e.PropertyName==“itemName”&&&!String.IsNullOrEmpty(row.itemName)) { //从远程服务->源获取产品 请求产品(row.itemName,row); } } 私有异步void requestProducts(字符串searchString,行documentsalewrapper行) { 如果(!String.IsNullOrEmpty(searchString)) { var products=await requestProductsAsync(搜索字符串); row.SugestProducts=listToObservable(产品); } } } 我的Xaml:

<DataGrid Grid.Row="1" Name="mainDataGrid" ItemsSource="{Binding Rows , UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Product">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Vertical">
                                <TextBox PreviewKeyDown="TextBox_PreviewKeyDown" KeyDown="TextBox_KeyDown" Text="{Binding itemName, UpdateSourceTrigger=PropertyChanged}" MinWidth="200"/>
                                <ListView ItemsSource="{Binding SugestProducts, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
                                          KeyDown="ListView_KeyDown" SelectedItem ="{Binding product, UpdateSourceTrigger=PropertyChanged}">
                                    <ListView.View>
                                        <GridView ColumnHeaderContainerStyle="{StaticResource myHeaderStyle}">
                                            <GridViewColumn  DisplayMemberBinding="{Binding code}"/>
                                            <GridViewColumn  DisplayMemberBinding="{Binding name}" />
                                        </GridView>
                                    </ListView.View>
                                </ListView>
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

基于上述注释,您应该在
itemName

    public override string itemName
    {
        get
        {
            return itemName;
        }
        set
        {
            itemName = value;
            NotifyPropertyChanged("itemName");
            NotifyChange(itemName); 
        }
    } 
然后定义事件以检索数据

private async void NotifyChange(string name)
{
    if (!String.IsNullOrEmpty(searchString))
    {
        var products = await requestProductsAsync(searchString);

        SugestProducts = listToObservable(products);
    }
}

1) 在ViewModel中根本不需要
DependencyProperty
,只要
ObservableCollection
就足够了2)INotifyPropertyChanged的
实现对于模型和ViewModel类来说是相同的问题,如果将product.name放置到RowDocumentSaleWraper.itemName,则从远程服务开始请求,在重写listview项的源代码并再次将RowDocumentSaleWraper.product设置为null之后,从一个合理的基本代码开始,然后继续执行更高级的变体和问题OK。我换了密码。但是我有同样的问题
公共类OrderViewModel:DependencyObject
=>这是错误的。。。和
row.PropertyChanged+=row\u PropertyChanged在c.tor中,同样没有意义
private async void NotifyChange(string name)
{
    if (!String.IsNullOrEmpty(searchString))
    {
        var products = await requestProductsAsync(searchString);

        SugestProducts = listToObservable(products);
    }
}