ListView ObservableCollection绑定

时间:2013-12-27 10:51:32

标签: c# wpf listview binding

我遇到了绑定Collection do ListView的问题。

 public static ObservableCollection<ParagonViewClass> mparagonViewList = new ObservableCollection<ParagonViewClass>();
        public ObservableCollection<ParagonViewClass> paragonViewList
        {
            get
            {
                return mparagonViewList;
            }
        }

在方法中,当用户添加新项目时,我将其添加到列表中:

paragonViewList.Insert(0, newPar);

还尝试了mparagonViewList.Insert(0,newPar);

xaml文件中的Itemssource:

<ListView Grid.Row="1" Name="paragonListView1" ItemsSource="{Binding paragonViewList}" .../>

@EDIT:Listview有DataTemplate(带有标签的网格 - 我确定绑定没问题,因为只需设置myListVIew.ItemsSource = myLis就可以了;)

看起来当我点击产品添加到listview时它会插入数据库,但我无法在listview上看到该产品。可能有一点点愚蠢的问题,但我真的找不到它;)

感谢您的回答!

1 个答案:

答案 0 :(得分:1)

查看您提供的代码,如果有的话,很难弄清楚您做错了什么。所以,我把一个有用的示例应用程序放在一起(无论如何从WPF的角度来看)。

我的模型名为ItemModel,而不是ParagonViewClass,定义如下

public class ItemModel
{
    public ItemModel() { }
    public string Text { get; set; }
}

我的Xaml

<Window x:Class="StackOverflow._20799346.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:common="clr-namespace:StackOverflow.Common;assembly=StackOverflow.Common"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
            <Button Content="Add Item" Click="AddItem_OnClick" />
        </StackPanel>
        <ListView ItemsSource="{Binding Path=Items}">
            <ListView.ItemTemplate>
                <DataTemplate DataType="{x:Type common:ItemModel}">
                    <TextBlock Text="{Binding Path=Text}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </DockPanel>
</Window>

请注意DataContext绑定到RelativeSource Self,允许将后面的代码用作ViewModel。我通常更喜欢创建一个单独的ViewModel类,但这种方法有其优点,因为可以直接从控件到ViewModel,而不是使用命令。

背后的代码,现在是视图模型,看起来像

public partial class MainWindow : Window
{
    private ObservableCollection<ItemModel> items;

    public MainWindow()
    {
        InitializeComponent();
    }

    public ObservableCollection<ItemModel> Items { get { return items ?? (items = new ObservableCollection<ItemModel>()); } }

    private void AddItem_OnClick(object sender, RoutedEventArgs e)
    {
        Items.Add(new ItemModel() { Text = Items.Count.ToString(CultureInfo.CurrentCulture) });
    }
}

我在Items属性上使用了延迟加载技术。它只会在访问时实例化。为简单起见,单击Add Item按钮时,我将添加一个新项目,其文本设置为Items集合的计数。

您应该能够将此代码转换为新的WPF应用程序项目,修复xaml文件中的命名空间并运行它。

现在,正如Rohit Vats在上面暗示的那样,Items属性不需要Setter。当通过它实现的INotifyPropertyChanged和INotifyCollectionChanged接口添加或删除项时,ObservableCollection本身会通知WPF绑定子系统。

我知道这并没有直接回答你的问题,但是如果没有关于原始问题的进一步信息(即代码),就不可能知道出了什么问题。

希望这个例子有所帮助。

注意:为简洁起见,我删除了异常管理。