Как я могу связать List как ItemSource с ListView в XAML? - PullRequest
3 голосов
/ 14 июня 2010

Я изучаю WPF и хотел бы иметь коллекцию, похожую на LinkedList, где я могу добавлять и удалять строки.И я хочу, чтобы ListView прослушивал эту коллекцию с привязкой к данным.Как я могу связать простую коллекцию списков с ListView в XAML?

Моя идея (не работает) выглядит примерно так:

<Window x:Class="TestApp.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <LinkedList x:Key="myList"></LinkedList> //Wrong
    <Window.Resources>
    <Grid>
    <ListView Height="100" HorizontalAlignment="Left" Margin="88,134,0,0" 
      Name="listView1" VerticalAlignment="Top" Width="120" 
      ItemsSource="{Binding Source={StaticResource myList}}"/> //Wrong
    </Grid>
</Window>

Весь мой код (обновленная версия, не работает):

<Window x:Class="TestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" 
          Name="textBox1" VerticalAlignment="Top" Width="120" />
        <Button Content="Button" Height="23" HorizontalAlignment="Right" 
          Margin="0,12,290,0" Name="button1" VerticalAlignment="Top" Width="75" 
          Click="button1_Click" />
        <ListView Height="100" HorizontalAlignment="Left" Margin="88,134,0,0" 
          Name="listView1" VerticalAlignment="Top" Width="120" 
          ItemsSource="{Binding myList}"/>
    </Grid>
</Window>

C # -код:

namespace TestApp
{
    public partial class MainWindow : Window
    {
        ObservableCollection<string> myList = new ObservableCollection<string>();
        public MainWindow()
        {
            InitializeComponent();
            myList.Add("first string");
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            myList.Add(textBox1.Text);
            textBox1.Text = myList.Count+"st";
        }
    }
}

Ответы [ 2 ]

6 голосов
/ 06 февраля 2013

Подход, выбранный в качестве ответа, работает нормально ... но мне не нравится указывать DataContext программно при настройке всего остального в XAML, я не чувствую, что это "правильно" (возможно, этопросто я).Поэтому для следующего человека или любого, кто думает как я и находит это в поисковой системе (как я), вот способ сделать это в XAML:

C #

public sealed partial class MainPage : Page
{
    public ObservableCollection<string> Messages { get; set; }

    public MainPage()
    {
        this.Messages = new ObservableCollection<string>();
        this.InitializeComponent();
    }
}

XAML

<Window
    ....
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    ...>

    <ListView ItemsSource="{Binding Messages}" ... />

</Window>

Если честно, я думаю, {Binding RelativeSource={RelativeSource Self}} должно быть значением по умолчанию для любого элемента верхнего уровня (Page, Window,и т. д.) DataConext, потому что многие просто ожидают, что это сработает, я знаю, что так оно и будет.Честно говоря, я чувствую, что {Binding RelativeSource={RelativeSource Self}} немного многословно и почти жаждет более короткого синтаксиса.

4 голосов
/ 14 июня 2010

Вы можете привязать только данные к общедоступным свойствам, и вам нужно установить DataContext.

public partial class MainWindow : Window
{
    public ObservableCollection<string> myList { get; private set; }

    public MainWindow()
    {
        InitializeComponent();

        myList = new ObservableCollection<string>();
        myList.Add("first string");
        DataContext = this;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        myList.Add(textBox1.Text);
        textBox1.Text = myList.Count + "st";
    }
}
...