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"));
        }
    } 
}
4

3 に答える 3

1

コードには2つの問題があります-

  • 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の命名規則に従ってください。プロパティ名の最初の文字は常に大文字にする必要があります。

于 2012-11-13T15:40:30.987 に答える
1
  • 仕事に拘束するために、テストは公共の財産でなければなりません。(プロパティが公開される必要があるのを見て驚いたが、それなしでは機能させることができなかった)
  • バインディングでプロパティを参照するには、次のいずれかを行う必要があります。
  • RVが提案するようにデータコンテキストを設定するか、次のように参照します。
<Grid>
    <DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=Tests}" />
</Grid>
于 2012-11-13T15:50:45.653 に答える
0

忘れないでください: PUBLICObservableCollectionテスト{get; プライベートセット}

于 2012-11-13T15:39:35.947 に答える