如何使用DataContext绑定到List <t>?</t>

时间:2009-04-14 01:06:27

标签: c# .net wpf xaml

我正在自学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 个答案:

答案 0 :(得分:5)

我的一部分想知道这是否与“MyIntegers”是公共领域而非财产这一事实有关。你可以重构你的课程看起来像这样并试试吗?

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

    public string Name { get; set; }
    public List<int> MyIntegers
    {
        get { return _ints; }
    }
}

答案 1 :(得分:0)

我运行了您的示例,当我点击按钮时,TextBox按预期填充了名称。

我遇到的唯一问题是ListView没有填充整数列表。 这与XAML对泛型不太一样的事实有关,如果你修改它以绑定到一个数组而不是它可以工作。 WPF支持消费XAML,它使用XAML中不支持的泛型。正如马特·汉密尔顿在他的回答中指出的那样,MyIntegers只需要通过添加一个获取者来成为一个普通人。

添加C#属性:

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

XAML:

<ListBox Grid.Row="2" ItemsSource="{Binding Path=MyInts}" />

答案 2 :(得分:0)

使用System.Collections.ObjectModel.ObservableCollection查看列表绑定而不是普通List。