C# WP8绑定未更新

C# WP8绑定未更新,c#,.net,windows-phone-8,C#,.net,Windows Phone 8,我正在尝试创建一个WP8应用程序,它从网站获取数据并显示它们。 我选择了全景模板,VisualStudio创建了一些默认代码 我想做的是,如果我更改文本绑定到的变量,textblock会自动更新。但是调用changeDate()不会改变UI。文本框仍然显示“dd.mm.yyyy” 现在,您的ViewModel了解该应用程序。只需使用: public void changeDate() { Date = "fu"; } 我认为正在发生的是,您的NotifyPropertyChanged

我正在尝试创建一个WP8应用程序,它从网站获取数据并显示它们。 我选择了全景模板,VisualStudio创建了一些默认代码

我想做的是,如果我更改文本绑定到的变量,textblock会自动更新。但是调用changeDate()不会改变UI。文本框仍然显示“dd.mm.yyyy”

现在,您的ViewModel了解该应用程序。只需使用:

public void changeDate()
{
    Date = "fu";
}

我认为正在发生的是,您的NotifyPropertyChanged是从某个工作线程调用的,这可能导致从同一个工作线程调用Dategetter。如果UI元素从工作线程(而不是从主UI线程)调用数据获取程序,则操作以“无效的跨线程访问”结束。如果是这样,您应该从主线程调用处理程序。例如:

private void NotifyPropertyChanged(String propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (null != handler)
    {
        Dispatcher dsp = Deployment.Current.Dispatcher;
        dsp.BeginInvoke(() => { 
            handler(this, new PropertyChangedEventArgs(propertyName));
        });
    }
}

如果我删除textblock的数据上下文并在主页构造函数中设置“DataContext=App.ViewModel;”,希望这会有所帮助

,textblock是空的。您在哪里初始化App.ViewModel?你也可以发布代码吗?我看不出添加的代码有什么问题。我怀疑您在代码的某个地方创建了ViewModel的新实例。您能在调用
changeDate
方法的地方显示代码吗?在MainViewModel.cs和MainPage.xaml.cs中添加了更多代码。加载时,viewmodel开始从网站加载数据。该数据被过滤,并将重要信息(日期和其他一些文本)提供给ui。changeData()方法本身不存在。我试图让它更容易:)我用pivot模板重写了整个项目。现在它就像一个符咒。。。但是非常感谢你。
MainPage.xaml.cs:
public MainPage()
{
    InitializeComponent();

    DataContext = App.ViewModel;
}

**UPDATE 2**
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (!App.ViewModel.IsDataLoaded)
    {
        App.ViewModel.LoadData();
    }
}
**END UPDATE 2**

[...]
App.xaml.cs:
private static MainViewModel viewModel = null;

public static MainViewModel ViewModel
{
    get
    {
        if (viewModel == null)
            viewModel = new MainViewModel();

        return viewModel;
    }
}
[...]
<TextBlock.DataContext>
    <ViewModels:MainViewModel/>
</TextBlock.DataContext>
public void changeDate()
{
    Date = "fu";
    App.ViewModel.Date = "bar";
}
public void changeDate()
{
    Date = "fu";
}
private void NotifyPropertyChanged(String propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (null != handler)
    {
        Dispatcher dsp = Deployment.Current.Dispatcher;
        dsp.BeginInvoke(() => { 
            handler(this, new PropertyChangedEventArgs(propertyName));
        });
    }
}