WinRT 绑定,UI 不更新
WinRT binding, UI does not Update
我有一个加载一些数据的视图模型。在加载时将 DependencyProperty 设置为 true,稍后又设置为 false。我经常在 WPF 中这样做,但是对于现代应用程序它不起作用。 :(
绑定到模型的视图应该显示模型是否仍在加载。它只是在加载页面时显示值,但在值更改后不会更新视图。
我写了一个小例子,它使用 SharedProjects 用于电话、现代应用程序和 WPF。 (BindingExample)
出于测试目的,它只是在 true 和 false 之间切换。
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>
页面的构造函数
public BlankPage1()
{
var v = new Viewmodle();
this.InitializeComponent();
this.DataContext = v;
v.Test();
}
视图模型:
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;
}
}
}
您可能需要 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 制作的视图模型开始您的测试
我有一个加载一些数据的视图模型。在加载时将 DependencyProperty 设置为 true,稍后又设置为 false。我经常在 WPF 中这样做,但是对于现代应用程序它不起作用。 :(
绑定到模型的视图应该显示模型是否仍在加载。它只是在加载页面时显示值,但在值更改后不会更新视图。
我写了一个小例子,它使用 SharedProjects 用于电话、现代应用程序和 WPF。 (BindingExample)
出于测试目的,它只是在 true 和 false 之间切换。
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>
页面的构造函数
public BlankPage1()
{
var v = new Viewmodle();
this.InitializeComponent();
this.DataContext = v;
v.Test();
}
视图模型:
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;
}
}
}
您可能需要 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 制作的视图模型开始您的测试