2009-11-24 3 views
1

При изучении C# и wpf я пытаюсь понять привязку данных. Пока что неудачно. Вся помощь, которую я мог найти в сети, даже если она описана как «для новичков», слишком сложна для меня, чтобы начать понимать. Я был бы признателен, если кто-то может предоставить код для связывания в очень простом примере:привязка данных wpf для новичков

namespace BindingTest 
{ 
    class TestClass 
    { 
     public int testProperty; 
     public TestClass() 
     { 
      testProperty = 10; 
     } 
    } 
} 

namespace BindingTest 
{ 
    public partial class Window1 : Window 
    { 
     TestClass iTestClass = new TestClass(); 
     public Window1() 
     { 
      InitializeComponent(); 
     } 
     private void buttonAdd10_Click(object sender, RoutedEventArgs e) 
     { 
      iTestClass.testProperty += 10; 
     } 
    } 
} 

<Window x:Class="BindingTest1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <TextBox Height="25" 
       Margin="52,0,130,89" 
       Name="textBox1" 
       VerticalAlignment="Bottom" 
     /> 
     <Button Height="34" 
       HorizontalAlignment="Left" 
       Margin="38,40,0,0" 
       Name="buttonAdd10" 
       VerticalAlignment="Top" 
       Width="62" 
       Click="buttonAdd10_Click"> 
     +10</Button> 
    </Grid>  
</Window> 

Все, что я хочу сделать, это связать TextBox1.Text с iTestClass.testProperty, так что, когда я нажимаю кнопку, я могу видеть его значение изменяется в текстовом поле. Какие изменения должны быть внесены в код этого простого примера для этого?

Если это можно сделать без INotifyPropertyChanged, то я хочу это сделать. Спасибо заранее!

Владимир

+0

Боюсь, что ваш единственный курс действий - изучить основы привязки данных и перейти оттуда. Раздел связывания данных WPF MSDN является достаточно хорошим местом для запуска (http://msdn.microsoft.com/en-us/library/ms750612.aspx). Я также настоятельно рекомендую статью журнала MVVM MSDN (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx), чтобы лучше понять, что такое хороший материал, который вы пытаетесь обойти. –

ответ

3

Для привязки к свойству в WPF у вас есть два варианта.

а) INotifyPropertyChanged
б) DependencyProperty

Поскольку вы не хотите использовать INotifyPropertyChanged, вы остаетесь с DependencyProperty.

В отделенном коде в MainWindow, добавьте эту строку в конструкторе:

this.DataContext = iTestClass; 

В XAML из MainWindow, добавьте этот атрибут в TextBox:

Text="{Binding testProperty}" 

Изменения TestClass следующий ,

class TestClass : DependencyObject 
{ 
    public int testProperty 
    { 
     get { return (int)GetValue(TestPropertyProperty); } 
     set { SetValue(TestPropertyProperty, value); } 
    } 

    public static readonly DependencyProperty TestPropertyProperty = 
     DependencyProperty.Register("testProperty", typeof(int), typeof(TestClass)); 

    public TestClass() 
    { 
     testProperty = 10; 
    } 
} 

Если вы предпочитаете версию INotifyPropertyChanged, изменить TestClass к этому (остальное то же самое):

class TestClass : INotifyPropertyChanged 
{ 
    private int _testProperty; 
    public int testProperty 
    { 
     get { return _testProperty; } 
     set 
     { 
      if (_testProperty == value) 
       return; 

      _testProperty = value; 

      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("testProperty")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public TestClass() 
    { 
     testProperty = 10; 
    } 
} 

Зачем вам это нужно? Ну, WPF не может сказать, изменилось ли свойство, если вы это не скажете.

Два способа, которыми WPF может сказать это событие, которое INotifyPropertyChanged предоставляет или регистрирует свойство в системе WPF, как работает версия DependencyProperty.

Если вы не сделаете ни одного из них, WPF не сможет указать, когда изменилось значение свойства, и поэтому привязка не будет работать.

+0

Благодарю вас, я посмотрю на способ dependecyproperty сделать это, вот что я имел в виду. BTW, я пробовал делать это с inotifypropertychanged, и у меня было почти то же самое, что вы мне здесь дали, но я всегда получаю ошибку: «BindingTest1.TestClass1» не реализует член интерфейса «System.ComponentModel.INotifyPropertyChanged.PropertyChanged», который кажется очень странным. Это может быть причиной Waht? – butaro

+0

ОК, забудьте об ошибке, я понял свою ошибку. – butaro