2010-01-14 3 views
1

Я написал очень короткое приложение, в котором я пытаюсь добиться следующего: измените его состояние с кодом CheckBox. Я подключил интерфейс INotifyPropertyChanged и ожидал увидеть некоторые результаты, но, видимо, приложение ничего не делает. Что-то не так с привязкой данных?Вопрос по привязке WPF

Window1.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Threading; 

namespace WpfTEST 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window, INotifyPropertyChanged 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      this.Loaded += new RoutedEventHandler(Window1_Loaded); 
      this.PropertyChanged += new PropertyChangedEventHandler(Window1_PropertyChanged); 
     } 

     public bool Flag 
     { 
      get { return m_flag; } 
      set 
      { 
       m_flag = value; 
       OnPropertyChanged("Flag"); 
      } 
     } 

     private bool m_flag = false; 

     void Window1_Loaded(object sender, RoutedEventArgs e) 
     { 
      this.m_cbox.DataContext = this; 

      for (int i = 0; i < 1000; i++) 
      { 
       Flag = (i % 2 == 0); 
       Thread.Sleep(200); 
      } 


     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnPropertyChanged(string name) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
     void Window1_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 

     } 

     #endregion 
    } 
} 

Window1.xaml

<Window x:Class="WpfTEST.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" x:Name="window"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.5*" /> 
      <ColumnDefinition Width="0.5*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="0.5*" /> 
      <RowDefinition Height="0.5*" /> 
     </Grid.RowDefinitions> 
     <CheckBox x:Name="m_cbox" Content="Let's see what happens" Grid.Row="2" Grid.Column="2" Grid.RowSpan="1" Grid.ColumnSpan="1" IsChecked="{Binding Path=Flag, ElementName=window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
</Window> 

ответ

2

Единственная реальная проблема, которую я вижу с вашим кодом, - это цикл сна в Loaded. Это приводит к тому, что поток пользовательского интерфейса не реагирует на время цикла, так как вы вставляете поток пользовательского интерфейса в заблокированное состояние.

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

<Window x:Class="WpfTEST.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" x:Name="window"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.5*" /> 
      <ColumnDefinition Width="0.5*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="0.5*" /> 
      <RowDefinition Height="0.5*" /> 
     </Grid.RowDefinitions> 
     <!-- I added this button: --> 
     <Button Click="Button_Click" Grid.Row="0" Grid.Column="0"/> 
     <CheckBox x:Name="m_cbox" Content="Let's see what happens" Grid.Row="2" Grid.Column="2" Grid.RowSpan="1" Grid.ColumnSpan="1" IsChecked="{Binding Path=Flag, ElementName=window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
</Window> 

и в коде позади:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Threading; 

namespace WpfTEST { 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window, INotifyPropertyChanged { 
     public Window1() { 
      InitializeComponent(); 
      this.Loaded += new RoutedEventHandler(Window1_Loaded); 
      this.PropertyChanged += new PropertyChangedEventHandler(Window1_PropertyChanged); 
     } 

     public bool Flag { 
      get { return m_flag; } 
      set { 
       m_flag = value; 
       OnPropertyChanged("Flag"); 
      } 
     } 

     private bool m_flag = false; 

     void Window1_Loaded(object sender, RoutedEventArgs e) { 
      this.m_cbox.DataContext = this; 
      Flag = false; 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnPropertyChanged(string name) { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
     void Window1_PropertyChanged(object sender, PropertyChangedEventArgs e) { 

     } 

     #endregion 

     private void Button_Click(object sender, RoutedEventArgs e) { 
      Flag = !Flag; 
     } 
    } 
} 

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

1

Это будет работать, только если свойство Flag свойство зависимостей. Для того, чтобы получить эту работу самым простым способом я могу думать я хотел бы сделать следующее: изменить ваше связывание быть:

IsChecked = «{Binding Path = Флаг, Mode = TwoWay}»

и в вашем конструктор в вашем коде за этим:

DataContext = this;

или в XAML

DataContext = "{Binding RelativeSource = {RelativeSource само}}"

Примечание: Флаг не должен быть свойством зависимостей, если вы устанавливаете DataContext быть окно.

+0

испробовал версию «кода» изначально, не уверен, что с ней не так – Maciek

 Смежные вопросы

  • Нет связанных вопросов^_^