0

XAML で宣言すると、Datacontext が機能しません。ただし、コードで設定した場合も同じように機能します。

詳細な分析。

マイ XAML

    <Window x:Class="SimpleDatabindingwithclass.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Name="windo">
    <Grid DataContext="{Binding ElementName=windo,Path=objectOfStudent}">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" Margin="25" Height="25" Width="100" HorizontalAlignment="Left" Name="TextBox1" Text="{Binding Path=StudentName}"></TextBox>

</Grid>
</Window>

対応コード。

    namespace SimpleDatabindingwithclass
    {
     /// <summary>
     /// Interaction logic for MainWindow.xaml
     /// </summary>
     public partial class MainWindow : Window
     {
         public MainWindow()
         {
              InitializeComponent();
              Student objectOfStudent = new Student();
              objectOfStudent.StudentName = "John diley";
              objectOfStudent.Address = "20, North Travilia, Washington DC.";
              //not setting datacontext here since i set that in xaml
         }
         public class Student
         {
             private string studentname;
             private string address;

             public string Address
             {
                 get { return address; }
                 set { address = value; }
        }
        public string StudentName
        {
            get{return studentname;}
            set{studentname = value;}
        }
    }
}

}

しかし、この XAML を使用してコードでデータ コンテキストを設定すると、同じように機能します。

つまり、次のようなものを置くと

     this.DataContext = objectOfStudent; 

MainWindow() では、アプリケーションが動作します。問題は何だと思いますか?

4

2 に答える 2

3

バインドはパブリック プロパティでのみ機能し、一部のローカル変数にバインドすることはできません。のパブリックobjectOfStudentプロパティとして作成しますMainWindow

編集:

public Student objectOfStudent { get; set; }

public MainWindow()
{
    InitializeComponent();
    objectOfStudent = new Student();
    objectOfStudent.StudentName = "John diley";
    objectOfStudent.Address = "20, North Travilia, Washington DC.";
    //not setting datacontext here since i set that in xaml
 }

編集:

また、INotifyPropertyChangedインターフェイスをMainWindowおよびStudentクラスに実装しPropertyChanged、プロパティを設定するときに発生させる必要があります。これは正しい方法です。プロパティを変更するたびにバインディングが更新されます。または簡単な方法: をobjectOfStudent呼び出す前に作成しますInitializeComponent

public MainWindow()
{
    objectOfStudent = new Student();
    objectOfStudent.StudentName = "John diley";
    objectOfStudent.Address = "20, North Travilia, Washington DC.";
    InitializeComponent();
    //not setting datacontext here since i set that in xaml
 }
于 2012-08-08T10:14:45.990 に答える
2

これは、 XAMLを介して名前が付けられたローカル変数objectOfStudentを使用しようとしているためです。これは、XAMLのコンテキストでは意味がありません。XAMLはフィールドとプロパティのみを受け入れ、ローカル変数は受け入れません。

于 2012-08-08T10:04:22.223 に答える