2013-03-16 53 views
-3
更新到程序的改變

我有一個WPF視圖模型WPF文本框不會在視圖模型

class MainWindowViewModel : INotifyPropertyChanged 
    { 
     private string _sql; 

     public string Sql 
     { 
      get { return _sql; } 
      set 
      { 
       if (value == _sql) return; 
       OnPropertyChanged("Sql"); 
       _sql = value; 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
} 

我也有一個XAML視圖中,帶有文本框

<Window.Resources> 
    <HbmSchemaExporter:MainWindowViewModel x:Key="viewModel"/> 
</Window.Resources> 
.... 

<TextBox Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2" Text="{Binding Source={StaticResource ResourceKey=viewModel}, Path=Sql,Mode=OneWay}"/> 

代碼背後

private MainWindowViewModel ViewModel 
    { 
     get { return Resources["viewModel"] as MainWindowViewModel; } 
    } 

問題是,當我在代碼viewModel.Sql = SOMETHING的文本框沒有得到更新。調試器在屬性中顯示正確的值,但文本框保持空白。

我也嘗試將綁定更改爲TwoWay,但只允許我用我在文本框中輸入的值覆蓋該屬性,這是我真的不想要的(實際上我仍然需要使其只讀,但它目前超出了範圍)。

如何在編程更新屬性後更新文本框?

該應用程序基本上是一個NHibernate DDL生成器,我在閱讀this後寫入。我需要按「生成SQL」按鈕,它顯示要運行到數據庫的代碼。

+0

OP評論:一旦我將使應用程序正常工作,而不僅僅是一個程序集,我可能會開源它 – 2013-03-16 21:36:11

回答

4
public string Sql 
{ 
    get { return _sql; } 
    set 
    { 
     if (value == _sql) return; 
     OnPropertyChanged("Sql"); 
     _sql = value; 
    } 
} 

這沒有意義。在調用任何PropertyChanged事件處理程序時,讀取Sql仍會提供舊值,因爲尚未更新_sql。您需要先更新該值,然後纔會提升PropertyChanged事件。

+0

這工作!我實際上在幾個月前從一個例子中複製了這段代碼片段,而我從來沒有用過程序更新的屬性來使用數據綁定。我還以爲是什麼背後OnPropertyChanged是一個異步機制(類似於「後處理程序完成了UI的性能線程掃描標更新」) – 2013-03-16 21:41:46

+1

@djechelon它實際上可能是一些控制在你所描述的方式做更新,不存在技術原因他們不可以。但它取決於用於'PropertyChanged'的任何事件處理程序。如果您無法控制它,則必須假定它可能直接讀取該屬性。 – hvd 2013-03-16 22:07:23