繁体   English   中英

绑定ObservableCollection <string> 到ListView

[英]Binding an ObservableCollection<string> to a ListView

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

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

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);
    }
}

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

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

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

对我来说,问题似乎是你绑定到你的类字段 相反,它定义为属性 ,它应该工作。

编辑

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

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

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

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

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

希望这可以帮助。

关于设置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属性。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM