绑定不适用于动态数据更新

时间:2011-12-16 21:55:53

标签: wpf

我是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并在Update()中调用MainWindow功能。 因此,此m_statusData的{​​{1}}已更改,我希望相应地更新MainWindow textbox

m_statusText

Xaml代码:

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;            
    }    
}

问题是:为什么 <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更新?

2 个答案:

答案 0 :(得分:3)

在这里,您将网格的DataContext分配给m_statusData:

 grid1.DataContext = m_statusData ;  

在这里,你将m_statusData重新分配给其他东西:

   m_statusData = newStatusData;  

问题是这对grid1.DataContext没有影响,grid1.DataContext设置为m_statusData的 previous 实例。

在这种情况下,执行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中,将Grid的DataContext绑定到StatusData属性

编辑: 要将网格的数据上下文绑定到StatusData属性,可以在XAML中执行此操作:

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

您还需要设置窗口的初始DataContext,以使所有其他数据绑定工作(这有点奇怪和非标准,但它会起作用):

this.DataContext = this;

答案 1 :(得分:0)

您的班级StatusData只有一个属性:StatusText。如果您希望使用此代码更改此属性:

m_statusData = newStatusData;

您可以将其更改为:

m_statusData.StatusText = newStatusData.StatusText;

此代码将触发PropertyChangedEvent类的StatusData,这将更改TextBox值。