我正在为我的研究使用MVVM模式(MVVM Light框架)编写一个小型UWP项目,并在许多场景和控件中遇到了绑定问题。
我已经努力将其中一个分为可用的小型示例项目here。
ProgressRing控件的IsActive属性对ViewModel方面的更新没有做出反应,即使它具有:
MainPage.xaml中
<Page
x:Class="TestProgressRing.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:local="using:TestProgressRing"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Width="491.282"
Height="492.308"
DataContext="{Binding MainPageViewModel, Source={StaticResource ResourceKey=Locator}}"
mc:Ignorable="d">
<Grid
Width="500"
Height="800"
Margin="0,0,-8.667,-307.667"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="3*" />
</Grid.RowDefinitions>
<Button
Grid.Row="0"
Width="250"
Height="50"
Margin="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="Boom">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Click">
<core:InvokeCommandAction Command="{Binding ClickCommand}" />
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
</Button>
<ProgressRing
Grid.Row="1"
Width="500"
Height="500"
Margin="0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
IsActive="{Binding IsLoading, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
Visibility="Visible" />
</Grid>
</Page>
MainPageViewModel.cs
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace TestProgressRing
{
public class MainPageViewModel : ViewModelBase
{
private bool _isLoading;
public bool IsLoading
{
get => _isLoading;
set
{
_isLoading = value;
Set(() => IsLoading, ref _isLoading, value);
}
}
public ICommand ClickCommand { get; set; }
public MainPageViewModel()
{
ClickCommand = new RelayCommand(() =>
IsLoading = !IsLoading);
}
}
}
UWP控件是否仅仅适用于常规Binding而不是x:Bind?还有更多问题,例如CalendarPickerView Date属性也不想合作。
答案 0 :(得分:6)
首先,您在绑定中不需要UpdateSourceTrigger=PropertyChanged, Mode=TwoWay
。它始终是源到目标(即OneWay
)。
真正的问题是,您不应该设置_isLoading = value;
,因为它已作为ref
传入,以检查属性值是否已更改。
因此,删除此行将使您的代码正常工作。您甚至可以将其简化为
private bool _isLoading;
public bool IsLoading
{
get => _isLoading;
set => Set(ref _isLoading, value);
}
答案 1 :(得分:-1)
尝试将绑定更改为:
IsActive="{Binding IsLoading}"
您的房产代码为:
private bool _isLoading;
public bool IsLoading
{
get {return _isLoading;}
set
{
_isLoading = value;
NotifyOfPropertyChange(nameof(IsLoading));
}
}
我已经使用了来自INotifyPropertyChanged
框架的Caliburn.Micro
的实现,但它可以是任何其他有效的实现;)