2017-03-09 64 views
-1

我试图实现MVVM。视图中的TextBox文本绑定到模型中的属性itemName。WPF中项目的绑定列表

在视图是数据网格 - >绑定到ViewModel.Rows属性

在视图模型上ITEMNAME上改变事件运行异步请求发送到远程服务为产品,这是前进到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)); 
      } 
     } 
} 

产品:

public class Product 
{ 
    public string name{get; set;} 
} 

我的视图模型是:

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); 
     } 

    } 
} 

我的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> 
+1

1)你不需要ViewModel中的DependencyProperty完全支持ObservableCollection 2)INotifyPropertyChanged对于你的模型和视图模型类的实现是相同的 – 2017-03-09 13:57:06

+0

如果将product.name放置到RowDocumentSaleWraper.item从远程服务中获取它的开始请求,在它重写listview项目的源并设置RowDocumentSaleWraper.product之后cond时间由null –

+0

再次,从一个合理的基本代码开始,然后继续更高级的变化和问题 – 2017-03-09 14:27:15

回答

1

基于上述意见,你应该从模子通知上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); 
    } 
}