我想使用 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 ObservableCollection
在 ExecuteSearchCommand
是禁忌。您的 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/