【问题标题】:Windows Store App - Dynamic Data BindingWindows 应用商店应用程序 - 动态数据绑定
【发布时间】:2013-10-01 08:03:59
【问题描述】:

我想动态更新我的 XAML 中定义的 ProgressBar 的值:

<ProgressBar HorizontalAlignment="Center"
                 Height="90" Margin="0,-30,0,0" 
                 VerticalAlignment="Center" 
                 Width="600" x:Name="BarProgress" Value="{Binding Test}" Maximum="100" />  

在页面的控件中我定义了这个类:

public class TestData
{
    public double Test { get; set; }
}

而在LoadState方法中:

TestData data = new TestData();
data.Test = downloadData.ProgressValue();
BarProgress.DataContext = data;

最后,在负责下载文件的类中,我有一个 ProgressValue 函数,它返回下载的百分比。 绑定似乎有效,但它不是动态的......我可以在 ProgressBar 中看到我为 downloadData.ProgressValue() 设置的第一个值...... 哪个是动态绑定的正确方法?!?!

【问题讨论】:

  • 通常当您看到第一个值但没有更改时,您会忘记通知属性更改,因此数据绑定永远不会更新。查看INotifyPropertyChanged
  • 负责下载的类,返回值downloadData.ProgressValue(),扩展INotifyPropertyChanged...

标签: c# xaml data-binding


【解决方案1】:

您的属性Test 不会通知,它只是使用自动生成的支持字段。

您还将从函数 (ProgressValue()) 返回的值类型分配给该属性而不是对象。这意味着在任何阶段都不会发生属性更改通知,因此数据绑定永远不会知道值已更改。

你需要扩展你的 TestData 类:

public class TestData : INotifyPropertyChanged
{
    public double Test 
    { 
        get { return _test; } 
        set 
        { 
            _test = value;  
            OnPropertyChange("Test");
        }
    }

    private double _test;

    private void OnPropertyChange(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChanged;
}

(完全凭记忆输入,不是从编辑器复制粘贴,请原谅任何拼写错误)

您还需要定期更新值(通过反复调用ProgressValue()),或者您需要想出一种不同的方式将更新后的值放入该属性中。

【讨论】:

  • 好的,真的很有趣...我怎样才能连续更新变量的值?如您所见,我在 LoadState 中调用 ProgressValue 函数一次...也许另一个想法可能是声明MainPage.xaml.cs 中的公共变量以及从下载类中调用它?
  • 可能 LoadState 方法也不是代码的正确位置...但是在哪里?!?
猜你喜欢
  • 2015-09-05
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多