c# - 创建 MVVM 搜索页面 Xamarin

标签 c# xaml xamarin mvvm cross-platform

我想使用 MVVM 创建 Xamarin 搜索页面。我在我的 MainWindowViewModel 中创建了一个逻辑,一旦用户在搜索器中输入了一个字符,它就必须更新我的 ListView。但我有这样的结果:In some reason UI is not updating

我不知道我做错了什么。
而且我想异步调用 ExecuteSearchCommand,如果你展示如何正确实现它,我会很高兴。
谢谢。

  <ContentPage.BindingContext>
    <ViewModels:MainWindowViewModel/>
  </ContentPage.BindingContext>

<ContentPage.Content>
    <StackLayout>

        <SearchBar SearchCommand="{Binding SearchCommand}" 
                   Text="{Binding EnteredText}"
                   />
        <Label Text="{Binding EnteredText}"></Label>
        <ListView x:Name="lstContatos" ItemsSource="{Binding MyList}" HasUnevenRows="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Grid MinimumHeightRequest="80" HeightRequest="120" HorizontalOptions="FillAndExpand" >
                                <Grid.RowDefinitions>
                                    <RowDefinition/>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>

                                <Label Grid.Row="0" Text="{Binding PhrasalVerb}"/>
                                <Button  Text="Delete" Grid.Column="1" BackgroundColor="Black" HeightRequest="30" WidthRequest="40" IsVisible="True"/>

                            </Grid>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

这是我绑定(bind)到 View 的 View 模型
        public string EnteredText
         {
         get { return enteredText; }
         set
         {
            enteredText = value;
            this.SearchCommand.Execute(null);
            OnPropertyChanged(nameof(EnteredText));
        }
    }


    void  ExecuteSearchCommand(object parameter)
    {
        if (enteredText.Length>=1)
        {
            MyList = new ObservableCollection<PhV_Get>(phrasalVerbGet
                .Where(x => x.PhrasalVerb.ToLower()
                .Contains(enteredText.ToLower())).ToList());
        }
        else
        {
            MyList = phrasalVerbGet;
        }

    }

    public ObservableCollection<PhV_Get> MyList
    {
        set
        {
            phrasalVerbGet = value;
            OnPropertyChanged(nameof(MyList));
        }
        get
        {
            return phrasalVerbGet;
        }
    }

    public Command SearchCommand {
        get
        {
            return new Command(ExecuteSearchCommand, 
            CanExecuteSeachCommand);
        }
    }

    public bool CanExecuteSeachCommand(object parameter)
    {
        return true;
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        this.PropertyChanged?.Invoke(this, new 
                    PropertyChangedEventArgs(propertyName));
    }

最佳答案

MyList = new ObservableCollectionExecuteSearchCommand是禁忌。您的 ListView 绑定(bind)到旧的 ObservableCollection - 当您创建一个新的时,您会破坏该绑定(bind)并且 View 不会更新,因为它对新的一无所知。

当您需要更改可观察集合的内容时,请这样做(在伪代码中):

MyList.Clear();
foreach (thing in myListOfThings) 
{
    MyList.Items.Add(thing);
}

这样,您将更新 ListView 绑定(bind)到的集合,并且 ListView 将看到更改。

关于c# - 创建 MVVM 搜索页面 Xamarin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44831382/

相关文章:

c# 语法和 Linq,IQueryable

Xamarin 表格 : Cannot add RESX for globalization

c# - XPath - 不包含表头的表行

wpf - ComboBox 到静态属性的双向绑定(bind)

c# - 以编程方式向 WPF 4.5 中的 Grid RowDefition 添加控件

xaml - 如何访问我选择的项目?列表框

android - 找出 Xamarin 应用随机崩溃的原因

c# - 意外错误-Xamarin iOS

c# - EF5 不创建枚举列

c# - 查询 C# 命名空间和使用