2011-12-16 63 views
2

我是WPF中的新成員,並且存在以下問題。綁定不適用於動態數據更新

我有很多屬性的下面的類,但在這裏只有一個,例如物業:

public class StatusData : INotifyPropertyChanged 
{ 
    private string m_statusText = String.Empty; 

    public StatusData() 
    { 
     m_statusText = "1234"; 
    } 
    public string StatusText 
    { 
     get 
     { 
      return m_statusText; 
     } 
     set 
     { 
      if (m_statusText != value) 
      { 
       m_statusText = value; 
       NotifyPropertyChanged("StatusText"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

該項目的另一個組成部分的變化StatusData並調用MainWindowUpdate()功能。 因此,MainWindowm_statusData已更改,我希望相應地更新textboxm_statusText

public class MainWindow 
{ 
    private StatusData m_statusData = new StatusData(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     grid1.DataContext = m_statusData ;   
    } 

    public void Update(StatusData newStatusData) 
    { 
     m_statusData = newStatusData;    
    }  
} 

XAML代碼:

<Window x:Class="WpfApplicationUpdateTextBox.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Name="myWin" 
    xmlns:local="clr-namespace:WpfApplicationUpdateTextBox" 
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" >  

    <Grid Name="grid1"> 

     <TextBox Text="{Binding Path=StatusText}" Name="textBox1" /> 

    </Grid> 
    </Window> 

的問題是:爲什麼textBox沒有與newStatusData.StatusText更新?

+0

Update方法在窗體加載後調用嗎?因爲你的Update方法不會更新DataContext。 – norlando 2011-12-16 22:03:30

+0

嗨,@norlando,是的,表單加載後調用的Update方法。我可以調用grid1。在Update方法中DataContext = m_statusData,但根據項目的設計,我需要調用每隔大約更新一次,因此grid1.DataContext = m_statusData將每秒完成一次。它可能是一個性能問題? – user1102760 2011-12-17 18:55:02

回答

3

在這裏,你要分配網格的的DataContext到m_statusData:

grid1.DataContext = m_statusData ; 

在這裏,您將重新分配m_statusData別的東西:

m_statusData = newStatusData; 

的問題是,這對GRID1沒有影響.DataContext,它被設置爲之前的 m_statusData的實例。

在這種情況下,做grid1.DataContext = newStatusData應該可以解決你的問題。但是,更好的解決方案是創建一個返回m_statusData的StatusData屬性。當m_statusData更改時,您可以對其執行RaisePropertyChanged()。

private void Update(StatusData newStatusData) 
{ 
    StatusData = newStatusData;    
} 

public StatusData StatusData 
{ 
    get 
    { 
     return m_statusData; 
    } 
    set 
    { 
     m_statusData = value; 
     RaisePropertyChanged("StatusData"); 
    } 
} 

...然後在您的XAML,綁定你的網格的的DataContext到StatusData財產

編輯: 到網格的數據上下文綁定到StatusData屬性,你可以在你的XAML做到這一點:

<Grid Name="grid1" DataContext="{Binding StatusData}"> 
    <TextBox Text="{Binding Path=StatusText}" Name="textBox1" /> 
</Grid> 

您還需要設置你的窗口的初始DataContext的,讓所有的其他數據綁定工作(這是一個有些奇怪和不規範,但它會做的伎倆):

this.DataContext = this; 
+0

嗨馬蒂蒔蘿。我可以問你2個問題嗎?你的第一個建議是有效的。謝謝。但是如果我需要每1秒調用一次Update方法(根據項目的設計),那麼grid1.DataContext = m_statusData將每1秒完成一次。它可能是一個性能問題?我喜歡你的第二個建議,但我沒有成功地將Grid的DataContext綁定到xaml中的StatusData屬性 。你能建議我怎麼能做到嗎?謝謝。 – user1102760 2011-12-17 19:03:31

0

您的等級StatusData只有1個物業:StatusText。如果此屬性是你想要使用此代碼更改的唯一的事情:

m_statusData = newStatusData; 

你可以把它改成這樣:

m_statusData.StatusText = newStatusData.StatusText; 

此代碼將觸發StatusDataPropertyChangedEvent,這將改變文本框值。