Простая привязка данных WPF - PullRequest
0 голосов
/ 16 декабря 2011

Я хочу отделить свой пользовательский интерфейс от моего кода, поэтому я (очевидно) приземлился в привязках.В качестве теста я написал следующий XAML:

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="Auto" Width="200">
    <StackPanel>
        <TextBox Text="{Binding Item}"/>
        <Button Content="Add" Click="AddNew"/>
        <ListBox Height="100" ItemsSource="{Binding Items}"/>
    </StackPanel>
</Window>

C # выглядит так:

namespace BindingTest
{
    public partial class MainWindow : Window
    {
        public string Item { get; set; }
        public ObservableCollection<string> Items { get; set; }

        public MainWindow()
        {
            InitializeComponent();
            Items = new ObservableCollection<string>();
        }

        private void AddNew(object sender, RoutedEventArgs e)
        {
            Items.Add(Item);
        }
    }
}

Я хочу, чтобы текст, введенный в текстовое поле, былдобавлен в список элементов источника.Однако этого не происходит ...

Ответы [ 5 ]

2 голосов
/ 16 декабря 2011

Две вещи, которые нужно сделать две -

  1. Set - DataContext = this; в вашем конструкторе.
  2. Было бы лучше, если бы вместо этого вы изменили свои свойства на свойства зависимостей. Вы можете легко сделать это с помощью фрагмента «propdp» в visual studio.
1 голос
/ 16 декабря 2011

Привязка данных выполняется к текущему контексту данных. Однако вы не установили контекст данных для своего окна. Часто вы устанавливаете контекст данных для модели представления, но в вашем случае вы просто хотите использовать для этого класс окна.

Вы должны добавить следующую строку в конструктор:

DataContext = this;
0 голосов
/ 16 декабря 2011

Попробуйте это

надеюсь, это сработает. Но это не правильный подход. Вам нужно установить DataContext для объекта, свойства которого вы используете для привязки. Вы должны следовать архитектуре MVVM.

0 голосов
/ 16 декабря 2011

Две вещи:

  1. Вы должны установить правильный контекст данных для своего окна.В противном случае привязка не найдет ваши свойства.
  2. Вы должны инициализировать коллекцию Items до вызова InitializeComponent(), поскольку внутри него ListBox пытается вычислить выражение и получить NULL в качестве источника привязки,А поскольку вы не реализуете INotifyPropertyChanged, а свойство не является DependencyProperty, ListBox никогда не будет переоценивать привязку, поэтому он никогда не получит экземпляр вашей коллекции Items.

Итак, код должен выглядеть следующим образом:

    public MainWindow()
    {
        Items = new ObservableCollection<string>();
        DataContext = this;
        InitializeComponent(); 
    }
0 голосов
/ 16 декабря 2011

Измените свой код на это:

    public partial class MainWindow : Window
    {
        public string Item { get; set; } 
        public ObservableCollection<string> Items { get; set; } 
        public MainWindow()
        {
            InitializeComponent(); 
            Items = new ObservableCollection<string>();
            DataContext = this;
        }

        private void AddNew(object sender, RoutedEventArgs e)
        {
            Items.Add(Item);
        }
    }
}

Вам нужно установить свой DataContext - у меня работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...