C# 如何处理视图模型中的数字框ValueChanged事件?

C# 如何处理视图模型中的数字框ValueChanged事件?,c#,wpf,binding,C#,Wpf,Binding,我试图检测用户何时更改了数字框值,并在视图模型中处理它 数字双框在XAML中定义如下: 在my ViewModel.cs中: private void DoubleBox\u值已更改(对象发送者,值更改开发者) { //省略代码:插入在文本更改时执行某些操作的代码。。。 } 当我右键单击XAML中的DoubleBox\u ValueChanged并“转到定义”时,它将导航到WM中的方法。但当我运行代码时,Visual Studio显示以下错误: System.Windows.Markup.

我试图检测用户何时更改了数字框值,并在视图模型中处理它

数字
双框
在XAML中定义如下:


在my ViewModel.cs中:

private void DoubleBox\u值已更改(对象发送者,值更改开发者)
{
//省略代码:插入在文本更改时执行某些操作的代码。。。
}
当我右键单击XAML中的
DoubleBox\u ValueChanged
并“转到定义”时,它将导航到WM中的方法。但当我运行代码时,Visual Studio显示以下错误:

System.Windows.Markup.XamlParseException:“”在“System.Windows.Data.Binding”上提供值时引发异常。“行号”123“和行位置”162“


有人能告诉我如何解决这个问题吗?

您使用的是隐藏的代码,而不是viewmodel;该错误意味着您尚未将DataContext与包含DoubleBox的窗口/UserControl/关联。必须设置ViewModel并将其绑定到DoubleBox的容器才能进行绑定。我给你举个简单的例子

public class ViewModel : INotifyPropertyChanged
    {

        private double _leadR;
        public double LeadR
        {
            get
            {
                return _leadR;
            }
            set
            {
                _leadR = value;
                OnPropertyChanged(nameof(LeadR));
                OnLeadRChanged();
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private void OnLeadRChanged()
        {
            //Do whatever you want with the new value of LeadR
        }
    }
然后在容器中,您甚至可以在构造函数中设置DataContext,如

public class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = new ViewModel();
            }
        }

希望这对您的问题有所帮助。

如果您想对
双框
上的值更改做出反应,只需在
leader
的setter中执行即可

private double _leadr;
public double LeadR
{
   get => _leadr;
   set
   {
      if (Math.Abs(_leadr - value) > 10E-12)
      {
         _leadr = value;
         OnPropertyChanged();

         // The value changed, do something with it here
      }
   }
}
您不需要也不应该处理视图模型中的
ValueChanged
事件。其他选项包括编写附加属性、跳跳虎动作或行为,但这对于您想要实现的目标来说可能太复杂了


您得到的绑定异常似乎源于使用了错误的类型,因为
XamlParseException
的内部异常是
InvalidCastException

解决了您的问题吗?这不是viewmodel,而是codebehind。为了使绑定工作,需要将xaml的DataContext属性设置为Viewmodel.cs文件,这样绑定才能工作。在viewmodel中还需要一个名为Leader的属性。请发布整个异常,屏幕截图显示了一个内部ExpException。如果您使用的是MVVM,则不应该有事件处理程序。即使不称之为mvvm,也不需要事件处理程序。为了得到一个好的答案,你需要提供更多的信息。与viewmodel的外观类似,无论它是否设置为datacontext。复制问题所需的最低代码和标记。不是你的整个项目(大多数人不会或无法下载)。