C# 在Xamarin中的SearchBar控件上使用SearchButtonPressed事件
我试图在用户按下搜索按钮时显示搜索栏控件的文本,但它不起作用 我使用MVVM模型和行为进行调试,当我调试它时,我可以看到值是正确的,并且它确实激活了正确的事件,但是UI没有改变 XAML文件:C# 在Xamarin中的SearchBar控件上使用SearchButtonPressed事件,c#,.net,xamarin,C#,.net,Xamarin,我试图在用户按下搜索按钮时显示搜索栏控件的文本,但它不起作用 我使用MVVM模型和行为进行调试,当我调试它时,我可以看到值是正确的,并且它确实激活了正确的事件,但是UI没有改变 XAML文件: <SearchBar Placeholder="Enter value..."> <SearchBar.Behaviors> <local:MainViewModel/> </SearchBar.Beh
<SearchBar Placeholder="Enter value...">
<SearchBar.Behaviors>
<local:MainViewModel/>
</SearchBar.Behaviors>
</SearchBar>
<Label Text="{Binding LabelTextPress}"/>
查看模型cs文件:
public class MainViewModel : Behavior<SearchBar>, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string val = "";
public string LabelTextPress => "You entered after press: " + val;
public string SearchValuePress
{
get
{
return val;
}
set
{
val = value;
}
}
protected override void OnAttachedTo(SearchBar searchBar)
{
searchBar.SearchButtonPressed += SearchButtonPress;
base.OnAttachedTo(searchBar);
}
protected override void OnDetachingFrom(SearchBar searchBar)
{
searchBar.SearchButtonPressed -= SearchButtonPress;
base.OnDetachingFrom(searchBar);
}
void SearchButtonPress(object sender, EventArgs e)
{
this.GetType().GetProperty("SearchValuePress").SetValue(this, ((SearchBar)sender).Text, null);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SearchValuePress)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(LabelTextPress)));
}
}
public类主视图模型:行为,INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
公共字符串val=”“;
公共字符串LabelTextPress=>“您在按下“+val;
公共字符串搜索值
{
得到
{
返回val;
}
设置
{
val=值;
}
}
受保护的覆盖无效附加到(搜索栏搜索栏)
{
searchBar.SearchButtonPressed+=SearchButtonPress;
base.OnAttachedTo(搜索栏);
}
受保护的覆盖无效OnDetachingFrom(搜索栏搜索栏)
{
searchBar.SearchButtonPressed-=SearchButtonPress;
base.OnDetachingFrom(搜索栏);
}
无效搜索按钮按(对象发送者,事件参数e)
{
this.GetType().GetProperty(“SearchValuePress”).SetValue(this,((SearchBar)sender.Text,null);
PropertyChanged?.Invoke(这是新的propertychangedventargs(nameof(SearchValuePress));
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(nameof(LabelTextPress));
}
}
如您所见,当用户按下搜索按钮时,标签应显示搜索栏的值,但它仅显示:“按下后输入的内容:”这是该字符串的初始值
谢谢 这里有几个问题,首先也是最重要的是LabelTextPress不是一个属性,而且您如何实现INotifyPropertyChanged也不正确。行为类已经实现了INotifyPropertyChanged,所以您不需要再次实现它 更重要的是,为什么你在这里需要一种行为?您可以使用SearchBar命令来处理视图模型中的搜索事件 请尝试以下操作: XAML: 更新以解决有关TextChanged的评论中的新问题:
<SearchBar x:Name="searchBar"
Placeholder="Enter value..."
TextChanged="Handle_TextChanged"
SearchCommand="{Binding SearchButtonPressed}"
SearchCommandParameter="{Binding Source={x:Reference searchBar}, Path=Text}">
这里有几个问题,首先也是最重要的是LabelTextPress不是一个属性,而且您如何实现INotifyPropertyChanged也是不正确的。行为类已经实现了INotifyPropertyChanged,所以您不需要再次实现它 更重要的是,为什么你在这里需要一种行为?您可以使用SearchBar命令来处理视图模型中的搜索事件 请尝试以下操作: XAML: 更新以解决有关TextChanged的评论中的新问题:
<SearchBar x:Name="searchBar"
Placeholder="Enter value..."
TextChanged="Handle_TextChanged"
SearchCommand="{Binding SearchButtonPressed}"
SearchCommandParameter="{Binding Source={x:Reference searchBar}, Path=Text}">
谢谢它起作用了。你能再给我解释一下吗?您可以在这里看到:SearchBar控件有另一个事件TextChanged。如何将命令绑定到控件的此事件?似乎命令仅用于单击控件。若要对TextChanged事件使用命令,则可以使用行为,因为SearchBar类中没有TextChangedCommand属性。但是,如果您打算在键入每个字符后更新UI,我将更新我的答案。可以从视图的代码隐藏更新视图模型,这样您就可以在代码隐藏中处理TextChanged事件,然后获取对BindingContext的引用并更新视图模型的LabelTextPress属性。谢谢!它起作用了。你能再给我解释一下吗?您可以在这里看到:SearchBar控件有另一个事件TextChanged。如何将命令绑定到控件的此事件?似乎命令仅用于单击控件。若要对TextChanged事件使用命令,则可以使用行为,因为SearchBar类中没有TextChangedCommand属性。但是,如果您打算在键入每个字符后更新UI,我将更新我的答案。可以从视图的代码隐藏中更新视图模型,这样就可以在代码隐藏中处理TextChanged事件,然后获取对BindingContext的引用并更新视图模型的LabelTextPress属性。
<SearchBar x:Name="searchBar"
Placeholder="Enter value..."
TextChanged="Handle_TextChanged"
SearchCommand="{Binding SearchButtonPressed}"
SearchCommandParameter="{Binding Source={x:Reference searchBar}, Path=Text}">
void Handle_TextChanged(object sender, TextChangedEventArgs args)
{
var viewModel = BindingContext as MainViewModel;
viewModel.LabelTextPress = args.NewTextValue;
}