2013-03-08 2 views
-3

Я только начал работать с WPF, и для начала я хотел бы знать, как программно добавить экземпляры моего собственного пользовательского класса с одним свойством «Имя» в список , и в списке будет отображаться каждый элемент как его имя в пользовательском интерфейсе, а не как «MyNamespace.CustomClass».Сами основы WPF Databinding

Я читал смутные сведения о DataContexts и DataBinding и DataTemplates, но я хочу знать абсолютный минимум, который я могу сделать, желательно с минимальным количеством XAML, насколько это возможно - я нахожу его довольно запутанным.

Спасибо!

+0

Нет реального обходного пути от XAML. Вам нужно будет справиться с этим. И это также делает некоторые вещи очень легкими! В [MSDN] достаточно учебных пособий (http://msdn.microsoft.com/en-us/library/aa970268.aspx). –

+1

DataContexts и DataBinding - это абсолютный минимум WPF – Kcvin

+0

Кажется, что каждый учебник использует огромное количество XAML, и соответствующие разделы этой темы никогда не ясны. Однако я знаю, что мне нужно будет иметь дело с некоторыми. – Miguel

ответ

3

Я знаю, что вы хотите избежать привязки, но я все равно выброшу его. постарайтесь не слишком бояться XAML, это немного сумасшествие, чтобы начать, но как только вы привыкнете ко всему {binding} s, это на самом деле довольно очевидно, простой пример привязки списка к коллекции в коде позади будет что-то как это.

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     Title="MainWindow" Height="350" Width="525"> 
    <ListBox ItemsSource="{Binding Items}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Window> 

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

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    public class MyClass 
    { 
     public string Name { get; set; } 
    } 

    public partial class MainWindow : Window 
    { 
     public ObservableCollection<MyClass> Items 
     { 
      get { return (ObservableCollection<MyClass>)GetValue(ItemsProperty); } 
      set { SetValue(ItemsProperty, value); } 
     } 
     public static readonly DependencyProperty ItemsProperty = 
      DependencyProperty.Register("Items", typeof(ObservableCollection<MyClass>), typeof(MainWindow), new PropertyMetadata(null)); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      Items = new ObservableCollection<MyClass>(); 
      Items.Add(new MyClass() { Name = "Item1" }); 
      Items.Add(new MyClass() { Name = "Item2" }); 
      Items.Add(new MyClass() { Name = "Item3" }); 
      Items.Add(new MyClass() { Name = "Item4" }); 
      Items.Add(new MyClass() { Name = "Item5" }); 
     } 
    } 
} 

При вставке в Visual Studio, как и в приведенном выше коде, следует показать это. enter image description here

+0

Хорошо, вы убедили меня попробовать. Я в основном скопировал ваш код, изменив типы данных и имена свойств везде, где это необходимо. Однако в представлении списка ничего нет - нет элементов, хотя отладчик говорит, что коллекция «Элементы» заполнена. вы уверены, что ваш код работает? Возможно, это была моя ошибка. – Miguel

+0

Я просто попытался скопировать код в новый проект, вставив результаты в качестве изображения, кажется, работает нормально. – Andy

+0

Ах да, это была моя ошибка - я понимаю синтаксис, поэтому я как-то определил второй список внутри первого ... Но спасибо за это простое объяснение, это то, что мне нужно! – Miguel