我正在自学C#,OOP和WPF,因此填充内容的可能性是惊人的。
因此,有人可以解释为什么在我的小测试示例中单击按钮后,Name属性出现在TextBox中但ListBox没有显示任何内容吗?
<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>
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>();
}
}
答案 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。