【问题标题】:TextBlock Won't Update文本块不会更新
【发布时间】:2014-07-23 00:42:13
【问题描述】:

我有一个 TextBlock (caloriesAvailableTextBlock) 我正在尝试更新。 Button (eatCaloriesButton) 应该将TextBlock 绑定的数字减少100。但是,TextBlock 不会更新。它只是保持在 2000 年。有什么我缺少的想法吗?

我在 HubPage.xaml 中的 xaml:

 <StackPanel>
     <TextBlock TextWrapping="Wrap" Text="Calories Available:" FontSize="24"/>
     <TextBlock x:Name="caloriesAvailableTextBlock" Loaded="caloriesAvailableTextBlock_Loaded" TextWrapping="Wrap" Text="{Binding}" FontSize="36"/>
     <Button x:Name="eatCaloriesButton" Content="Eat 100 Calories" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="18" Click="eatCaloriesButton_Click" FontFamily="Global User Interface"/>
 </StackPanel>

我在 HubPage.xaml.cs 中的代码:

    public CalorieTracker CalorieTracker { get; set; }

    private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
    {
        CalorieTracker = new CalorieTracker();
        CalorieTracker.CaloriesAvailable = 2000;
    }

    private void eatCaloriesButton_Click(object sender, RoutedEventArgs e)
    {
        CalorieTracker.CaloriesAvailable -= 100;
    }

    private void caloriesAvailableTextBlock_Loaded(object sender, RoutedEventArgs e)
    {
        ((TextBlock)sender).DataContext = CalorieTracker.CaloriesAvailable;
    }

我的 CalorieTracker.cs 类包含我要更新的号码:

public class CalorieTracker : INotifyPropertyChanged
{
    private int caloriesAvailable;
    public int CaloriesAvailable
    {
        get { return caloriesAvailable; }
        set { caloriesAvailable = value;
        NotifyPropertyChanged("CaloriesAvailable");
        }
    }

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

我的理解是,每当更改CalorieTracker.CaloriesAvailable 时,它都会让该变量的所有出现都知道,但事实并非如此。知道为什么不?还是我离基地太远了?

【问题讨论】:

    标签: c# xaml data-binding windows-phone-8.1 textblock


    【解决方案1】:

    这里的问题似乎是您如何设置绑定。

    您为您的文本块将 整个 DataContext 设置为该 int。这不是你想要做的。为了更新变量变化,很多东西必须有所不同(对于初学者来说,运行时必须监听DataContextChanged而不是PropertyChanged)。

    相反,将页面的DataContext 设置为您的视图模型,然后绑定到一个属性:

    <TextBlock x:Name="caloriesAvailableTextBlock" TextWrapping="Wrap" Text="{Binding CaloriesAvailable}" FontSize="36"/>
    
    private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
    {
        DataContext = CalorieTracker = new CalorieTracker();
        CalorieTracker.CaloriesAvailable = 2000;
    }
    

    现在您的NotifyPropertyChanged 将实际执行您的预期,并且您的 UI 将更新。无论如何,这更适合 MVVM 模式。

    【讨论】:

    • 我搜索了几个小时,而你只是在几分钟内就教了我......谢谢!!!! (您的解释实际上为我澄清了很多关于如何使用 DataContext 的问题。)
    • @Evorlor 每个视图一个视图模型是一个很好的经验法则。很高兴你能够让它工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多