簡體   English   中英

將Datagrid綁定到ObservableCollection <T> 在SIlverlight

[英]Binding Datagrid to ObservableCollection<T> in SIlverlight

我正在努力將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"));
        }
    } 
}

您的代碼中有兩個問題 -

  • You can only bind with property而不能You can only bind with property字段。 所以首先使Test屬性。
  • 其次,您需要將DataContext to self for設置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的命名慣例。 屬性名稱的第一個字母應始終為大寫。

  • 對於綁定工作,測試必須是公共屬性。 (我很驚訝地看到該物業需要公開,但沒有它可以讓它工作)
  • 要參考綁定中的屬性,您必須要么
  • 設置像RV建議的datacontext或像這樣的引用:
<Grid>
    <DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=Tests}" />
</Grid>

不要忘記: PUBLIC ObservableCollection測試{get; 私人套裝}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM