2013-10-01 3 views
0

Я хочу обновить динамически ценность ProgressBar, определенный в моем XAML:Windows Store App - Dynamic Data Binding

<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() ... Какой правильный путь для динамической привязки?!?!

+0

Обычно, когда вы видите первое значение, но никаких изменений, вы забыли уведомить об изменении свойства, чтобы привязка данных никогда не обновлялась. Проверьте [INotifyPropertyChanged] (http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged%28v=vs.110%29.aspx). – slugster

+0

Класс, ответственный за загрузку, который возвращает значение downloadData.ProgressValue(), расширяет INotifyPropertyChanged ... – CaptainAmerica

ответ

0

Ваша недвижимость 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()) или вам нужно разработать другой способ поместить обновленное значение в это свойство.

+0

ОК, действительно интересно ... как я могу обновить с непрерывностью значение переменной? Как вы можете видеть, я называю ProgressValue функция один раз в LoadState ... может быть, другая идея могла бы объявить общедоступную переменную в MainPage.xaml.cs и вызывать ее из класса загрузки? – CaptainAmerica

+0

, вероятно, также метод LoadState не подходит для кода ... но где?!? – CaptainAmerica