将ObservableCollection <string>绑定到ListView </string>

时间:2011-09-18 18:49:29

标签: c# .net wpf

这应该非常简单,我只想在用户将文本框中的内容添加到我的可观察集合时更新列表视图。

我不明白为什么我不能这样做:

XAML

<Window x:Class="MyStuff.WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="486" Width="540" WindowStyle="SingleBorderWindow" ResizeMode="NoResize" >
    <Grid>
        <Menu IsMainMenu="True" VerticalAlignment="Top" HorizontalAlignment="Stretch" FlowDirection="LeftToRight">
            <MenuItem Header="File" >
                <MenuItem Header="Open File..">
                </MenuItem>
                <MenuItem Header="Exit">
                </MenuItem>
            </MenuItem>               
        </Menu>
        <TextBox Height="36" HorizontalAlignment="Left" Margin="12,27,0,0" Name="textBoxSearchTerm" VerticalAlignment="Top" Width="414" FontSize="24" MaxLength="80" AcceptsReturn="False" Background="#FFFFFFE8" Text="asdfasdf" FontWeight="Bold" FontFamily="Calibri" FontStretch="Normal" />
        <Button Content="Add" Height="36" HorizontalAlignment="Left" Margin="435,27,0,0" VerticalAlignment="Top" Width="68" FontSize="20" FontWeight="Normal" FontFamily="Calibri" Click="AddSearchTerm_Click" />

        <ListView Height="338" HorizontalAlignment="Left" Margin="12,97,0,0" Name="listView1" VerticalAlignment="Top" Width="261" ItemsSource="{Binding SearchTerms}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="120" Header="Search Term" DisplayMemberBinding="{Binding}" />
            </GridView>
        </ListView.View>
    </ListView>

    </Grid>
</Window>

代码背后

public partial class MainWindow : Window
{
    public ObservableCollection<string> searchItems = new ObservableCollection<string>();

    public MainWindow()
    {
        InitializeComponent();
    }

    // DEFINE A PROPERTY..
    public ObservableCollection<string> SearchItems
    {
        get { return searchItems; }
    }

    private void AddSearchTerm_Click(object sender, RoutedEventArgs e)
    {
        searchItems.Add(textBoxSearchTerm.Text);
    }
}

3 个答案:

答案 0 :(得分:4)

  

如何在SearchTerms中引用每个项目?                        我可以做DisplayMemberPath =“{Binding SomeProperty}”                        但是如果我只想要实际的对象,比如字符串呢?

要绑定到项目本身,只需使用{Binding}

有关详细信息以及作为资源,请参阅WPF Binding CheatSheet - 这是第一个列出的绑定选项。

答案 1 :(得分:3)

关于设置datacontext的Tigrans回答是正确的。这是进行数据绑定所必需的。有许多方法可以实现,但最简单的方法是将datacontext设置为viewmodel(SearchItems)。

public MainWindow()
{
    InitializeComponent();
    this.DataContext = SearchItems;
}

然后您的绑定看起来像<ListView ... ItemSource={Binding}> 你也有{Binding SearchTerm}几次,但我没有看到它会绑定的属性(也许是一个错字)。

绑定DataContext的另一个选项是将其设置为控件本身:

this.DataContext = this;

这会将绑定表达式更改为{Binding Path=SearchItems},因为这会告诉绑定引擎在当前datacontext上查找SearchItems属性。

希望这有帮助。

答案 2 :(得分:2)

对我来说,问题似乎是你绑定到你的班级字段。 将其定义为属性,相反,它应该有效。

修改

我注意到你没有指定一个DataContext的窗口,这导致没有绑定。

1)将集合移动到单独的类(某些DataLayer类)

2)为Window的DataContext属性分配该类的实例。 在这种情况下,您在列表视图中绑定,必须看起来像这样:

<ListView ... ItemsSource="{Binding Path=SearchTerms}">

在你的后面代码内部使用与分配给Window的DataContext属性的类完全相同的实例来添加/删除集合中的元素。

希望这有帮助。