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