C# mvvm:从文本框中筛选wpf listview值

C# mvvm:从文本框中筛选wpf listview值,c#,wpf,xaml,listview,mvvm,C#,Wpf,Xaml,Listview,Mvvm,我是MVVM新手。我有一个要求。我有一个文本框和一个listview。当用户在文本框上输入文本时,listview会通过过滤文本填充数据。用户可以从listview中选择一个项目,然后文本框获得Selectedvalue,listview不可见(在选择项目后)。我可以在wpf普通代码中这样做,但我不知道如何在MVVM模式中这样做。以下是我对普通wpf的看法: <TextBox Name="txtbxProductName" TextChanged="txtbxProd

我是MVVM新手。我有一个要求。我有一个文本框和一个listview。当用户在文本框上输入文本时,listview会通过过滤文本填充数据。用户可以从listview中选择一个项目,然后文本框获得Selectedvalue,listview不可见(在选择项目后)。我可以在wpf普通代码中这样做,但我不知道如何在MVVM模式中这样做。以下是我对普通wpf的看法:

<TextBox  Name="txtbxProductName"
          TextChanged="txtbxProductName_TextChanged"
          KeyUp="txtbxProductName_KeyUp"
          />

<ListView Name="lstvwProduct"
          Visibility="Collapsed"
          MouseLeftButtonUp="lstvwProduct_MouseLeftButtonUp"
          KeyDown="lstvwProduct_KeyDown">
    <ListView.View>
      <GridView>
        <GridViewColumn DisplayMemberBinding="{Binding Path=Product_Name}"
                        Header="Product Name"
                        Width="240" />
         <GridViewColumn DisplayMemberBinding="{Binding Path=Product_Code}"
                         Header="Product Code"
                         Width="80" />
        </GridView>
       </ListView.View>
     </ListView>
如何在MVVM中实现这一点我的观点如下:

<TextBox  Name="txtbxProductName"
          Width="119"
          Text="{Binding Path=ProductName,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
          />

 <ListView ItemsSource="{Binding Path=ProductRecords}"
           SelectedItem="{Binding Path=SelectedProduct,Mode=TwoWay}"
           IsSynchronizedWithCurrentItem="True"
           Name="lstvwProduct"
            >
      <ListView.View>
        <GridView>
          <GridViewColumn DisplayMemberBinding="{Binding Path=ProductName}"
                          Header="Product Name"
                          Width="100" />
          <GridViewColumn DisplayMemberBinding="{Binding Path=ProductCode}"
                          Header="Product Code"
                           Width="100" />
         </GridView>
      </ListView.View>
 </ListView>

以下是我的ViewModel属性:

private string _productName;
public string ProductName
{
    get { return _productName; }
    set
    {
        _productName = value;
        RaisePropertyChanged("ProductName");
    }
}
private List<Tbl_Product_Master> _ProductRecords;
public List<Tbl_Product_Master> ProductRecords
{
    get { return _ProductRecords; }
    set
    {
        _ProductRecords = value;
        RaisePropertyChanged("ProductRecords");
    }
}
 private Tbl_Product_Master _selectedProduct;
 public Tbl_Product_Master SelectedProduct
{
    get { return _selectedProduct; }
    set
    {
        _selectedProduct = value;
        RaisePropertyChanged("SelectedProduct");
    }
}
private string\u产品名称;
公共字符串产品名称
{
获取{return\u productName;}
设置
{
_产品名称=价值;
RaisePropertyChanged(“产品名称”);
}
}
私人列表(产品记录);;
公开列表记录
{
获取{return\u ProductRecords;}
设置
{
_ProductRecords=值;
RaisePropertyChanged(“ProductRecords”);
}
}
专用Tbl\u产品\u主控\u选择的产品;
公共Tbl\u产品\u主选择产品
{
获取{return\u selectedProduct;}
设置
{
_所选产品=价值;
RaisePropertyChanged(“SelectedProduct”);
}
}

如何在MVVM中执行此操作?

向viewmodel添加一个附加属性以显示/隐藏ListView:

private bool showProductList;
public bool ShowProductList
{
   get { return showProductList; }
   set 
   { 
       showProductList = value;
       RaisePropertyChanged("ShowProductList");
   }
}
在Viewmodel中连接PropertyChanged处理程序,并根据需要设置属性:

public MyViewModel()
{
   PropertyChanged += MyViewModel_PropertyChanged;
}

private bool handleSelectedProductChanges = true;

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
   if(e.PropertyName == "ProductName")
   {
      handleSelectedProductChanges = false;

      // update ProductRecords

      handleSelectedProductChanges = true;
   }
   else if(e.PropertyName == "SelectedProduct")
   {
      if (handleSelectedProductChanges && SelectedProduct != null)
      {
          ProductName = SelectedProduct.Name;
          ShowProductList = false;
      }
    }
}

要绑定ListView的
可见性
,您需要一个bool-To-Visibility转换器。

,在MyViewModel上,如果(e.PropertyName==“ProductName”){//update-ProductRecords},当ProductRecords更新(保留4条记录)并调用RaisePropertyChanged时,更新ProductRecords是什么意思(“ProductRecords”),然后如果(SelectedProduct!=null){ProductName=SelectedProduct.Name;ShowProductList=false;},则依次激发SelectedProduct属性将重置ProductName属性,该属性将再次更新ProductRecords,因此我编辑了我的答案并添加了bool变量以防止属性更改循环。希望这有帮助!
public MyViewModel()
{
   PropertyChanged += MyViewModel_PropertyChanged;
}

private bool handleSelectedProductChanges = true;

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
   if(e.PropertyName == "ProductName")
   {
      handleSelectedProductChanges = false;

      // update ProductRecords

      handleSelectedProductChanges = true;
   }
   else if(e.PropertyName == "SelectedProduct")
   {
      if (handleSelectedProductChanges && SelectedProduct != null)
      {
          ProductName = SelectedProduct.Name;
          ShowProductList = false;
      }
    }
}