将Datagrid绑定到SIlverlight中的ObservableCollection <t> </t>

时间:2012-11-13 15:34:01

标签: c# data-binding silverlight-5.0

我正在努力将DataGrid绑定到SIlverlight中的ObservableCollection。

我的简单代码如下。它目前显示一个空白的DataGrid。我已经通过了教程等,我确信我遗漏了非常基本的东西。

主页XAML

<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  x:Class="Tower.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot">
    <sdk:DataGrid Grid.Row="1" Margin="10" IsReadOnly="True" ColumnWidth="120" ItemsSource="{Binding Path=Tests, Mode=OneWay}" AllowDrop="True" />
</Grid>

主页代码背后:

public partial class MainPage : UserControl
{
    public ObservableCollection<Test> Tests { get; set; }

    public MainPage()
    {
        InitializeComponent();

        DataContext = this;

        Tests = new ObservableCollection<Test>();
        Tests.Add(new Test() { Label = "Test1" });
        Tests.Add(new Test() { Label = "Test2" });
        Tests.Add(new Test() { Label = "Test3" });
        Tests.Add(new Test() { Label = "Test4" });
    }
}

测试类:

public class Test : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged; 

    private String _Label;

    public String Label
    {
        get
        {
            return _Label;
        }
        set
        {
            _Label = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Label"));
        }
    } 
}

3 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题 -

  • You can only bind with property而不是字段。所以首先制作Test财产。
  • 其次,您需要将DataContext to self for绑定设置为有效。

    public partial class MainPage : UserControl
    {
       public ObservableCollection<Test> Tests { get; set; }
    
       public MainPage()
       {
           InitializeComponent();
    
           DataContext = this;
    
           Tests = new ObservableCollection<Test>();
           Tests.Add(new Test() { Label = "Test1" });
           Tests.Add(new Test() { Label = "Test2" });
           Tests.Add(new Test() { Label = "Test3" });
           Tests.Add(new Test() { Label = "Test4" });
       }
    }
    

XAML -

<Grid x:Name="LayoutRoot">
    <sdk:DataGrid Grid.Row="1" Margin="10" IsReadOnly="True" ColumnWidth="120"
              ItemsSource="{Binding DataContext.Tests,
                RelativeSource={RelativeSource FindAncestor,
                 AncestorType= UserControl}}" AllowDrop="True" />
</Grid>

注意propertyName - 它应该是Tests而不是tests。这只是一个侧面说明,遵循Microsoft的命名惯例。属性名称的第一个字母应始终为大写。

答案 1 :(得分:1)

  • 对于绑定工作测试必须是公共属性。 (我很惊讶地看到该物业需要公开,但没有它可以让它工作)
  • 要参考绑定中的属性,您必须
  • 像建议的RV一样设置datacontext 或者像这样引用:
<Grid>
    <DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=Tests}" />
</Grid>

答案 2 :(得分:0)

不要忘记: PUBLIC ObservableCollection测试{get;私人套餐}