XAML 绑定到WPF属性的属性得到更新,但WPF属性不更改

px9o7tmv  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(130)

我需要使一个窗口改变位置每次光标得到它。我在为“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”,那么当触发事件时,窗口确实会移动。

eaf3rand

eaf3rand1#

这是因为在XAML文件中,您将值绑定到公共属性“RecordingViewTop”,而在“Move”方法中,您正在更新其私有var“_recordingViewTop”。
只需将您的“Move”方法更改为:

private void Move()
{
    if (RecordingViewTop == 0)
    {
        RecordingViewTop = SystemParameters.PrimaryScreenHeight - 150;
        MessageBox.Show(RecordingViewTop.ToString());
    }
    else
    {
        RecordingViewTop = 0; 
        MessageBox.Show(RecordingViewTop.ToString());
    }
}

字符串

相关问题