我需要使一个窗口改变位置每次光标得到它。我在为“MouseEnter”创建一个事件触发器时没有遇到任何问题,它调用了ViewModel中的一个方法。该方法更改一个名为“RecordingViewTop”的双精度型,并且该双精度型绑定到xaml文件的“Window.Top”属性。所以它应该改变窗口的位置,每次事件被激发,但这不会自动发生,我不知道为什么。
以下是Window.Top属性当前在.XAML文件中的情况:
Top="{Binding RecordingViewTop, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
字符串
和双RecordingViewTop:
private double _recordingViewTop;
public double RecordingViewTop
{
get { return _recordingViewTop; }
set
{
if (_recordingViewTop != value)
{
_recordingViewTop = value;
OnPropertyChanged();
}
}
}
型
下面是我对OnPropertyChanged()的实现:
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
型
我想不通。当我调试代码时,我可以看到“RecordingViewTop”确实得到了正确的更新,但不知何故,这并没有转移到我在Window.Top上创建的绑定。我该怎么弥补?
更新:下面是RecordingViewModel类:
public class RecordingViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ICommand _moveCommand;
public ICommand MoveCommand
{
get { return _moveCommand ??= new CommandHandler(() => Move(), () => true); }
}
private double _recordingViewTop;
public double RecordingViewTop
{
get { return _recordingViewTop; }
set
{
if (_recordingViewTop != value)
{
_recordingViewTop = value;
OnPropertyChanged();
}
}
}
public RecordingViewModel() { }
private void Move()
{
if (RecordingViewTop == 0)
{
_recordingViewTop = SystemParameters.PrimaryScreenHeight - 150;
MessageBox.Show(RecordingViewTop.ToString());
}
else
{
_recordingViewTop = 0;
MessageBox.Show(RecordingViewTop.ToString());
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
型
下面是DataContext当前的设置方式:
public partial class RecordingView : Window
{
public RecordingView()
{
InitializeComponent();
RecordingViewModel recordingViewModel = new RecordingViewModel();
SetViewModel(recordingViewModel);
}
public RecordingView SetViewModel(RecordingViewModel recordingViewModel)
{
DataContext = recordingViewModel;
return this;
}
}
型
这是我最近尝试的XAML文件:
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<i:InvokeCommandAction Command="{Binding MoveCommand}"/>
<i:ChangePropertyAction PropertyName="Top" Value="{Binding RecordingViewTop, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
型
如您所见,有一个MessageBox只是为了查看是否调用了Move(),以及RecordingViewTop是否相应地更新,如果我将鼠标移动到窗口上,但窗口根本没有移动,则可以正常工作。奇怪的是,如果我将“ChangePropertyAction”Value直接设置为一个特定的值,比如“500”,那么当触发事件时,窗口确实会移动。
1条答案
按热度按时间eaf3rand1#
这是因为在XAML文件中,您将值绑定到公共属性“RecordingViewTop”,而在“Move”方法中,您正在更新其私有var“_recordingViewTop”。
只需将您的“Move”方法更改为:
字符串