C# WPF中项目的绑定列表
我试图实现MVVM。视图中的文本框文本绑定到模型中的属性itemName 在视图上是DataGrid->绑定到ViewModel.Rows属性 在ViewModel on itemName on change事件中,对产品的远程服务运行异步请求,该请求转到model SugestProducts属性。SugestProducts属性是ListView项的源 如果产品超过0,则打开listview。ListView SelectedItem绑定到模型产品属性 我需要在列表视图中选择产品,从product.name属性中填充itemName属性,而无需请求远程服务。其他工作很好 我的模型是: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
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);
}
}