2017-03-09 62 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); 
    } 
}