Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Xamarin中的SearchBar控件上使用SearchButtonPressed事件_C#_.net_Xamarin - Fatal编程技术网

C# 在Xamarin中的SearchBar控件上使用SearchButtonPressed事件

C# 在Xamarin中的SearchBar控件上使用SearchButtonPressed事件,c#,.net,xamarin,C#,.net,Xamarin,我试图在用户按下搜索按钮时显示搜索栏控件的文本,但它不起作用 我使用MVVM模型和行为进行调试,当我调试它时,我可以看到值是正确的,并且它确实激活了正确的事件,但是UI没有改变 XAML文件: <SearchBar Placeholder="Enter value..."> <SearchBar.Behaviors> <local:MainViewModel/> </SearchBar.Beh

我试图在用户按下搜索按钮时显示搜索栏控件的文本,但它不起作用

我使用MVVM模型和行为进行调试,当我调试它时,我可以看到值是正确的,并且它确实激活了正确的事件,但是UI没有改变

XAML文件:

   <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;
}