Как связать со списком <T>, используя DataContext? - PullRequest
2 голосов
/ 14 апреля 2009

Я самообучаюсь C #, OOP и WPF, так что потенциал для взлетов огромен.

Итак, может кто-нибудь объяснить, почему после нажатия кнопки в моем крошечном тестовом примере свойство Name появляется в TextBox, но ListBox ничего не показывает?

XAML:

<Window x:Class="BindingTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="BindingTest" Height="250" Width="300">
<Grid Name="mainGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
        <RowDefinition Height="50" />
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>
    <Button 
            Grid.Row="0"
            Name="MakeIntListButton"
            Click="MakeIntListButton_Click">Make and Display Integer List</Button>
    <TextBox Grid.Row="1" Text ="{Binding Path=Name}"
             />
    <ListBox
        Grid.Row="2"
        ItemsSource="{Binding Path=MyIntegers}"
        />
</Grid>

C #:

using System;
using System.Collections.Generic;
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 BindingTest
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void MakeIntListButton_Click(object sender, RoutedEventArgs e)
        {
            AClass InstanceOfAClass = new AClass();
            InstanceOfAClass.MyIntegers.Add(6);
            InstanceOfAClass.MyIntegers.Add(7);
            InstanceOfAClass.MyIntegers.Add(42);

            InstanceOfAClass.Name = "Fred";


            mainGrid.DataContext =InstanceOfAClass ;
        }
    }

    public class AClass
    {
        public string Name {get;set;}
        public List<int> MyIntegers = new List<int>();
    }
}

Ответы [ 3 ]

5 голосов
/ 14 апреля 2009

Часть меня интересует, связано ли это с тем, что «MyIntegers» является публичным полем, а не собственностью. Можете ли вы сделать так, чтобы ваш класс выглядел так и попробовать?

public class AClass
{
    private List<int> _ints = new List<int>();

    public string Name { get; set; }
    public List<int> MyIntegers
    {
        get { return _ints; }
    }
}
0 голосов
/ 15 апреля 2009

Изучите использование System.Collections.ObjectModel.ObservableCollection для привязки списка вместо простого списка.

0 голосов
/ 14 апреля 2009

Я запустил ваш образец, и когда я нажал на кнопку, текстовое поле заполнилось именем, как и ожидалось.

Единственная проблема, с которой я столкнулся, заключалась в том, что ListView не заполнялся списком целых чисел. Это связано с тем, что XAML не очень удобен с универсальными шаблонами, если вы изменяете его для привязки к массиву, вместо этого он работает. WPF поддерживает точное использование XAML, он использует универсальные шаблоны в XAML, который не поддерживается. Как указывает Мэтт Хэмилтон в своем ответе, MyIntegers просто нужно сделать пророчеством, добавив в него аксессор get.

Добавить C # Свойство:

public int[] MyInts { get { return MyIntegers.ToArray(); } } 

XAML:

<ListBox Grid.Row="2" ItemsSource="{Binding Path=MyInts}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...