2013-02-19 3 views
8

У меня есть проект, в котором я привязываю свойство IsChecked checkbox с помощью get/set в коде. Однако, когда приложение загружается, по какой-то причине оно не обновляется. Заинтригованный, я раздел ее до ее основ, например:WPF DataBinding не обновляется?

//using statements 
namespace NS 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private bool _test; 
     public bool Test 
     { 
      get { Console.WriteLine("Accessed!"); return _test; } 
      set { Console.WriteLine("Changed!"); _test = value; } 
     } 
     public MainWindow() 
     { 
      InitializeComponent(); 
      Test = true; 
     } 
    } 
} 

XAML:

<Window x:Class="TheTestingProject_WPF_.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" DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<Grid> 
    <Viewbox> 
     <CheckBox IsChecked="{Binding Path=Test, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
    </Viewbox> 
</Grid> 

И, вот, и вот, когда я установил его так, он не обновлялся !

Любой может придумать исправление или объяснить, почему?

Спасибо, было бы полезно.

+0

читать [вводный материал ] (http://msdn.microsoft.com/en-us/library/ms752347.aspx). –

+2

Я не думаю, что заслуживаю нисходящего звена, потому что я читал еще один источник, а не MSDN ... –

+2

@ofstream Я не спускал вниз, но я подозреваю, что это потому, что этот вопрос не показывает никаких исследований. Эта проблема чрезвычайно проста, и любой, кто работает с системой привязки WPF, знает, что вам нужно реализовать 'INotifyPropertyChanged', чтобы ваши свойства уведомляли пользовательский интерфейс, чтобы переоценить привязку при их изменении. Практически каждый учебник WPF, в котором представлены привязки, охватывает эту концепцию. – Rachel

ответ

22

В целях поддержки связывания данных, ваш объект данных должен реализовать INotifyPropertyChanged

Кроме того, это всегда хорошая идея Separate Data from Presentation

public class ViewModel: INotifyPropertyChanged 
{ 
    private bool _test; 
    public bool Test 
    { get { return _test; } 
     set 
     { 
      _test = value; 
      NotifyPropertyChanged("Test"); 
     } 
    } 

    public PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

<Window x:Class="TheTestingProject_WPF_.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"> 
<Grid> 
    <Viewbox> 
     <CheckBox IsChecked="{Binding Path=Test, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
    </Viewbox> 
</Grid> 

кодекса За:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel{Test = true}; 
    } 
} 
+0

Это работает, спасибо! Я приму вас, когда SO позволит мне :) –

+0

короткий, чистый и понятный. благодаря! – mcy