将一个ObservableCollection<string>绑定到ListView

4

这应该很容易,我只想在用户向我的可观测集合添加内容时更新列表视图中的内容。

我不明白为什么我不能让它工作:

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个回答

4
如何引用 SearchTerms 中的每个项目? 我可以使用 DisplayMemberPath =“{Binding SomeProperty}” 但是如果我只想要实际对象,例如字符串呢?
要绑定到项目本身,只需使用 {Binding}
有关详细信息和资源,请参阅 WPF Binding CheatSheet(第一种列出的绑定选项)。WPF Binding CheatSheet

谢谢!尽管如此还是不起作用,我已经更新了我的问题,并尝试了最新的方法。 - Jason

3
对我来说,问题似乎在于您将绑定对象绑定到了类的字段上。 相反,应该将其定义为属性,然后它应该可以正常工作。 编辑 我注意到您没有给窗口分配一个DataContext,这会导致无法进行绑定。
1)将集合移动到单独的类中(某个DataLayer类)。
2)为窗口的DataContext属性分配该类的实例。 在这种情况下,您在列表视图中的绑定应该看起来像这样:
<ListView ... ItemsSource="{Binding Path=SearchTerms}">

在您的后端代码中,使用与分配给 Window 的 DataContext 属性相同的类实例来添加/删除集合中的元素。
希望这能帮到您。

尝试过了,但我的列表视图仍然没有更新。我已经使用了现在的代码进行了更新。 - Jason
但是你没有为窗口分配DataContent。将你的集合移动到另一个类(DataLayer)。 - Tigran

3

Tigran的回答在设置数据上下文方面是正确的。这是进行数据绑定所必需的。有许多方法可以实现这一点,但最简单的方法是将数据上下文设置为您的视图模型(SearchItems)。

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

那么你的绑定将会是这样的:<ListView ... ItemSource={Binding}> 另外,你有几个地方用到了{Binding SearchTerm},但是我没有看到它要绑定的属性(可能是打字错误)。

另一种设置DataContext的绑定方式是将其设置为控件本身:

this.DataContext = this;

这将把你的绑定表达式更改为{Binding Path=SearchItems},这将告诉绑定引擎在当前数据上下文中查找SearchItems属性。
希望这有所帮助。

这个代码:this.DataContext = this; 解决了我的问题。虽然大家都给出了很好的答案,还是要谢谢大家。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接