2016-01-30 4 views
0

Я пытаюсь понять концепцию привязки данных, я узнал, что привязка данных - это способ, которым вы можете связывать элементы интерфейса с объектами, чтобы любое изменение в любом из них повлияло на другое (в случае связыванию два пути), но это не работает в этом простом примере:Data Binding не работает

мой класс:

namespace dataBinding.Models 
{ 
public class person 
{ 
    public string name { get; set; } 

    public override string ToString() 
    { 
     return this.name; 
    } 
} 
} 

XAML:

xmlns:models="using:dataBinding.Models" 
<Page.DataContext> 
    <models:person x:Name="personObject" name="Person's Name"/> 
</Page.DataContext> 

    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Right" 
       Text="{Binding name, Mode=TwoWay}" /> 

    <Button Name="changeNameButton" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Left" 
      Content="Change Name" /> 

с # Код:

namespace dataBinding 
{ 
public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     changeNameButton.Click += ChangeNameButton_Click; 
    } 

    private void ChangeNameButton_Click(object sender, RoutedEventArgs e) 
    { 
     personObject.name = "New Name"; 
    } 
} 
} 

Когда я запустил приложение, в TextBlock отображается «Имя человека», но нажатие кнопки changeName не изменяет то, что показано в TextBlock, так что я здесь отсутствует?

+1

реализовать ли ваш personObject INotifyPropertyChanged? – RvdK

+2

Вам не хватает 'INotifyPropertyChanged' [реализация интерфейса] (https://msdn.microsoft.com/en-gb/library/ms229614 (v = vs.110) .aspx) на вашем« объекте ». – Michael

+2

Вы должны использовать интерфейс 'INotifyPropertyChanged'. Проверьте это сообщение, которое содержит полную реализацию интерфейса: http://stackoverflow.com/questions/33691293/toggle-list-box-display-in-wpf –

ответ

2

Отсутствует интерфейс реализации INotifyPropertyChanged. Ваш XAML не знает, что он был изменен.

Легко исправить, используйте https://github.com/Fody/PropertyChanged Он добавит код, чтобы уведомить всех о том, что свойство изменилось.

[ImplementPropertyChanged] 
public class person 
{ 
    public string name { get; set; } 

    public override string ToString() 
    { 
     return this.name; 
    } 
} 
+0

это работает, спасибо за ваше время <3 –

0

Простое Data Binding (The Orginal коды вывешенного Mahak Гупт апр 10, 2012)

Шаг1: Сначала мы создаем сетку в нашем проекте:

<Grid x:Name="StuInfo"> 
    <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" MinWidth="77"></ColumnDefinition> 
      <ColumnDefinition></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
</Grid> 

Шаг 2. После этого мы создаем в нашей программе два текстовых блока и два текстовых поля, а также создаем кнопку (Далее), чтобы увидеть следующую запись в соответствии с программой.

<TextBlock Text="First Name" Margin="10"></TextBlock> 
<TextBlock Text="Last Name" Margin="10" Grid.Row="1"></TextBlock> 
<TextBox Text="{Binding fname}" Margin="10" Grid.Column="1"></TextBox> 
<TextBox Text="{Binding lname}" Margin="10" Grid.Column="1" Grid.Row="1"></TextBox> 
<Button HorizontalAlignment="Left" Margin="0,12,0,9" Name="button1" Width="75" Grid.Column="1" Grid.Row="2">Next</Button> 

enter image description here

Шаг 3: Теперь мы добавим Loaded обработчик событий на странице .cs. Это событие будет вызываться, когда клиент хочет, чтобы загрузить приложение:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(Page_Loaded); 
    } 
    void Page_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 

Шаг 4: Теперь мы добавим класс к нашей программе:

public class Stu 
{ 
    public string fname { get; set; } 
    public string lname { get; set; } 
} 

Step5: Теперь мы пишем следующее код в Loded обработчика событий:

void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    Stu s = new Stu(); 
    { 
     s.fname = "Mahak"; 
     s.lname = "Garg"; 
    }; 
     this.StuInfo.DataContext = s; 
} 

Как мы упоминаем привязку в TextBox в.XAML страница:

<TextBox Text="{Binding fname}" Margin="10" Grid.Column="1"></TextBox> 
<TextBox Text="{Binding lname}" Margin="10" Grid.Column="1" Grid.Row="1"></TextBox> 

Выход будет:

enter image description here

Step6: Теперь мы добавим еще один обработчик событий, который для кнопки Далее:

public Window1() 
{ 
    InitializeComponent(); 
    this.Loaded += new RoutedEventHandler(Page_Loaded); 
    this.button1.Click += new RoutedEventHandler(button1_Click); 
} 
void button1_Click(object sender, RoutedEventArgs e) 
{ 
    Stu s = new Stu(); 
    { 
     s.fname = "Juhi"; 
     s.lname = "Gupta"; 
    }; 
    this.StuInfo.DataContext = s; 
} 

Здесь мы добавили еще один документ а в нашей программе. Когда мы нажимаем на кнопку Далее, на выходе будет:

enter image description here

+0

Для получения более подробной информации перейдите по ссылке (http://www.c-sharpcorner.com/UploadFile/mahakgupta/simple-data-binding-in-wpf/) Веб-адрес –

+0

woa отличный ответ. Большое спасибо за ваше время –

+0

Не связано с проблемой OP. Проблема OP была явно отсутствием реализации интерфейса INotifyPropertyChanged. Какой элемент управления видом причины не был уведомлен об изменениях ограниченных значений. В этом ответе «DataContext» был изменен новым объектом ... – Fabio