2015-01-06 2 views
0

У меня есть модель просмотра, которая загружает некоторые данные. При загрузке DependencyProperty установлено значение true, а позже false. Я часто делал это в WPF, но с современными приложениями он не работает. :(Связывание WinRT, пользовательский интерфейс не обновляется

мнение, что связано с моделью должна показывает, если модель еще грузится. Это просто показывает значение при загрузке страницы, но не обновляет вид после изменения значения.

Я написал небольшой пример, который использует SharedProjects для телефона, Modern App и WPF. (BindingExample)

для целей тестирования он просто переключается между истинным и ложным.

XAML

<Page 
    x:Class="App2.BlankPage1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:App2" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"> 

    <Grid > 
     <TextBlock Text="{Binding Loading, Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30" Width="100" Height="100"/> 
    </Grid> 
</Page> 

конструктору Page

public BlankPage1() 
    { 
     var v = new Viewmodle(); 
     this.InitializeComponent(); 
     this.DataContext = v; 

     v.Test(); 
    } 

Viewmodle:

public class Viewmodle : DependencyObject 
{ 

    public bool Loading 
    { 
     get { return (bool)GetValue(LoadingProperty); } 
     set { SetValue(LoadingProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Loading. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty LoadingProperty = 
     DependencyProperty.Register("Loading", typeof(bool), typeof(Viewmodle), new PropertyMetadata(false)); 

    public async void Test() 
    { 
     while (true) 
     { 
      await System.Threading.Tasks.Task.Delay(1000); 
      this.Loading = true; 
      await System.Threading.Tasks.Task.Delay(1000); 
      this.Loading = false; 
     } 
    } 

} 

ответ

1

Вы, вероятно, хотите INotifyPropertyChanged вместо DependencyObject. То, как вы привязываетесь прямо сейчас, на самом деле является просто связующим свойством, но на самом деле не использует DependencyProperty. Об этом можно узнать, удалив свойство CLR и получив регистрацию DependencyProperty. Вы увидите, что привязка завершилась неудачно во время выполнения. Связывание DependencyProperty, по-видимому, полезно только тогда, когда источник возник из xaml. Таким образом, вместо того, чтобы ваша модель представления в коде, как вы едите, вы могли бы сделать что-то вроде этого

<Grid.Resources> 
    <local:Viewmodle x:Name="viewModel"/> 
</Grid.Resources> 
<TextBlock Text="{Binding ElementName=viewModel, Path=Loading}"/> 

, то вы могли бы назвать viewModel.Test() в конструкторе, чтобы начать свой тест с помощью XAML модель вид

Смежные вопросы