簡體   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