简体   繁体   中英

Binding an ObservableCollection<string> to a ListView

This should be really easy, I just want to update the listview when the user adds something in the textbox to my observable collection.

I don't understand why I can't get this working:

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>

Code Behind

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

How do I reference each item in SearchTerms Here? I can do DisplayMemberPath="{Binding SomeProperty}" But what if I just want the actual object, like a string?

To bind to the item itself, just use {Binding} .

For details, and as a resource, refer to the WPF Binding CheatSheet - this is the first listed binding option.

To me it seems that the problem is that you're binding to your class field . Define it like a property , instead, and it should work.

EDIT

I noticed that you don't assign a DataContext of you window, which leads to NO binding.

1) Move the collection to separate class (some DataLayer class)

2) Assign to Window's DataContext property an instance of that class. In this case you binding in list view, has to look something like this:

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

After inside your back code use exactly the same instance of the class which was assigned to Window's DataContext property to Add/Remove elements from collection.

Hope this helps.

Tigrans answer is correct with regards to setting the datacontext. This is required to do databinding. There are a number of ways this can be accomplished but the easiest way would be to set the datacontext to your viewmodel (SearchItems).

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

Then your binding would look like <ListView ... ItemSource={Binding}> Also you have {Binding SearchTerm} a couple times but i do not see a property that it would be binding to (maybe a typo).

Another option for binding the DataContext is to set it to the control itself:

this.DataContext = this;

This will change your binding expressions to {Binding Path=SearchItems} as this will tell the binding engine to look for the SearchItems property on the current datacontext.

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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