gpt4 book ai didi

c# - 使用 MVVM 绑定(bind) ObservableCollection

转载 作者:太空狗 更新时间:2023-10-29 21:44:49 24 4
gpt4 key购买 nike

我正在尝试将应该是非常基本的 MVVM 示例的内容放在一起,但我无法使其正常工作。基本上,我想将一个 ObservableCollection 绑定(bind)到一个 ListBox,并为用户提供一个搜索选项来搜索其他项目。搜索后,ListBox 应该随着集合的变化而刷新。这是我的代码:

型号:

public class Item
public string Name { get; set; }
}

View 模型:

public class ViewModel : INotifyPropertyChanged
{
private ObservableCollection<Item> _items { get; set; }
public ObservableCollection<Item> Items
{
get { return _items; }
set
{
_items = value;
RaisePropertyChanged("Items");
}
}

public void GetDefaultItems()
{
ObservableCollection<Item> temp = new ObservableCollection<Item>();
temp.Add(new Item() { Name = "abc" + " 1" });
temp.Add(new Item() { Name = "def" + " 2" });
temp.Add(new Item() { Name = "ghi" + " 3" });
Items = temp;
}


public void Search(string query)
{
ObservableCollection<Item> temp = new ObservableCollection<Item>();
temp.Add(new Item() { Name = query + " 1" });
temp.Add(new Item() { Name = query + " 2" });
temp.Add(new Item() { Name = query + " 3" });
Items = temp;
}

public event PropertyChangedEventHandler PropertyChanged;

private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

查看:

<Grid x:Name="LayoutRoot">
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock x:Name="Name" Text="{Binding Name}" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>

主页.xaml:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<TextBox x:Name="txtSearch"/>
<TextBlock Text="Items:" />
<views:ItemView x:Name="ItemsOnPage" />
</StackPanel>
</Grid>

最后是 MainPage.xaml.cs:

public partial class MainPage : PhoneApplicationPage
{
private ViewModel vm;

// Constructor
public MainPage()
{
InitializeComponent();
txtSearch.KeyUp += txtSearch_KeyUp;
vm = new ViewModel();
}

void txtSearch_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
vm.Search(txtSearch.Text);
}
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
vm.GetDefaultItems();
ItemsOnPage.DataContext = vm.Items;
}
}

结果是,我可以看到第一次加载默认项,但是当我搜索时,列表没有刷新。现在都是硬编码的,所以如果搜索有效,我应该会看到他们搜索的 3 个项目。

不过我注意到的是,如果我在 RaisePropertyChanged 处的 ViewModel 中设置断点,this.PropertyChanged始终为 null ,所以它永远不会进入 if 语句。我见过在模型上使用 INotifyPropertyChanged 的示例,但在这种情况下,因为我需要在集合更改时得到通知,所以在 View 模型上使用似乎是正确的。这可能是错误的,但我不确定如何设置它。

谁能看出我做错了什么?

最佳答案

尝试这样做

  1. 将 ItemSource 设置为 Items

  2. 清除和添加数据项

    String preQuery="";
    public void Search(string query)
    {
    if(preQuery==query)
    return;

    Items.Clear();

    Items.Add(new Item() { Name = query + " 1" });
    Items.Add(new Item() { Name = query + " 2" });
    Items.Add(new Item() { Name = query + " 3" });
    }

希望这对您有所帮助。

关于c# - 使用 MVVM 绑定(bind) ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21325060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com