2012-11-13 94 views
0

我正在努力將DataGrid綁定到SIlverlight中的ObservableCollection。將數據網格綁定到ObservableCollection <T> in SIlverlight

我非常簡單的代碼如下。它目前顯示一個空白的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")); 
     } 
    } 
} 

回答

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的命名約定。屬性名稱的第一個字母應始終爲大寫。

+0

謝謝!然而,在這些變化之後仍然掙扎。 –

+0

您是否已將xaml中的屬性名稱更新爲'Tests'而不是'tests'? –

+0

是的,現在都是首都。 –

0

不要忘記: PUBLIC ObservableCollection tests {get;私定}

+0

加入!沒有影響,但我敢打賭,這是簡單的事情... –

+0

爲什麼公共?你認爲這個班級沒有訪問其私人成員嗎? –

+0

對不起...我正在用viewmodels ... 嘗試在設置datacontext之前初始化您的observablecollection。 – jug

1
  • 對於綁定工作測試必須是公共財產。 (我很驚訝地看到,房地產需要的是公衆,但不能讓它不工作)
  • 對於您必須
  • 設置的DataContext像RV建議 或參考這樣的結合referenceing屬性:
<Grid> 
    <DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=Tests}" /> 
</Grid> 
+0

也許公衆的要求並不是很奇怪,畢竟我們引用了另一個類的實例。 (內部也沒有工作) –

相關問題