Wpf 如何在代码中创建绑定并从属性发出通知?

Wpf 如何在代码中创建绑定并从属性发出通知?,wpf,xaml,binding,Wpf,Xaml,Binding,视图包含两个按钮。 在ViewModel中,“IsShiftLock”属性驻留并动态创建绑定 public bool IsShiftLock { get { return _isShiftLock; } set { if (value != _isShiftLock) { _isShiftLock = value; Notify("IsShiftLock");

视图包含两个按钮。 在ViewModel中,“IsShiftLock”属性驻留并动态创建绑定

 public bool IsShiftLock {
        get { return _isShiftLock; }
        set {
            if (value != _isShiftLock) {
                _isShiftLock = value;
                Notify("IsShiftLock");                   
            }
        }
    }
Notify是BaseViewModel中的一个方法

public abstract class BaseViewModel : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;

   public void Notify(string sPropertyName)
{
  PropertyChangedEventHandler changedEventHandler = this.PropertyChanged;
  if (changedEventHandler == null)
    return;
  changedEventHandler((object) this, new PropertyChangedEventArgs(sPropertyName));
}
}

IsShiftLock会正确更改,但转换器调用只发生一次。 据我所知,绑定应该得到适当的更改通知。如何做到这一点

更新1:

视图侧:

private readonly KeyboardViewModel viewModel;
public static KeyboardViewModel ViewModelInstance;

    public VirtualKeyboard() {             
            Loaded += OnLoaded;
            InitializeComponent();

            viewModel = new KeyboardViewModel();
            DataContext = viewModel;

            ViewModelInstance = viewModel;
    }

问题出在绑定
Source
属性中。您应该将它设置为
this.DataContext
或其他一些源,这样它就可以工作了

            Binding b2 = new Binding {
                Source = this.DataContext,
                Path = new PropertyPath("IsShiftLock"),
                Converter = new ShiftLockToTextConverter()
            };

问题出在绑定
Source
属性中。您应该将它设置为
this.DataContext
或其他一些源,这样它就可以工作了

            Binding b2 = new Binding {
                Source = this.DataContext,
                Path = new PropertyPath("IsShiftLock"),
                Converter = new ShiftLockToTextConverter()
            };

问题在于KeyViewModel本身继承了BaseViewModel,并订阅了PropertyChangedEvent。我不了解整个情况,但我解决了这个问题


每个KeyViewModel都显式订阅了PropertyChangedEvent,因此,不知何故,我尝试为Shift按钮和Caps Lock动态设置的绑定被破坏了。不幸的是,我不了解引擎盖下的整体情况。

问题是KeyViewModel本身继承了BaseViewModel,并订阅了PropertyChangedEvent。我不了解整个情况,但我解决了这个问题


每个KeyViewModel都显式订阅了PropertyChangedEvent,因此,不知何故,我尝试为Shift按钮和Caps Lock动态设置的绑定被破坏了。不幸的是,我不了解引擎盖下的整体情况。

你能添加一些
xaml
?绑定片段-它驻留在哪里:在视图中还是视图模型中?另外,
curKeyView.Button
-是
curKeyView
您的视图吗?如果是这样的话,您是否有一个名为
button
的按钮?没有xaml。我动态创建xaml。绑定驻留在ViewModel中。不,curKeyView不是视图。KeyView是一个表示按钮及其类型的类(无论它是什么意思)。您可以添加一些
xaml
?绑定片段-它驻留在哪里:在视图中还是视图模型中?另外,
curKeyView.Button
-是
curKeyView
您的视图吗?如果是这样的话,您是否有一个名为
button
的按钮?没有xaml。我动态创建xaml。绑定驻留在ViewModel中。不,curKeyView不是视图。KeyView是一个表示按钮及其类型的类(不管它是什么意思)。我需要从一个ViewModel将一个ViewModel实例(我在视图中实例化)放入源代码中。所以,我这样做了:我在视图中创建了公共静态KeyboardViewModel ViewModelInstance,现在Source=VirtualKeyboard.ViewModelInstance。但它仍然不起作用:(请看,我的更新1。据我所知,现在的问题是通知。IsShiftLock调用Notify,但绑定应该如何订阅它?我是否正确,绑定应该以某种方式通知属性的更改?)当我调试时,我看到在通知(“IsShiftLock”)时没有人被订阅正在调用。@EngineersPack请添加
xaml
。我做了样品溶液,它对我有效。好的,我知道了。我需要从一个ViewModel将一个ViewModel实例(我在视图中实例化)放入源代码中。所以,我这样做了:我在视图中创建了公共静态KeyboardViewModel ViewModelInstance,现在Source=VirtualKeyboard.ViewModelInstance。但它仍然不起作用:(请看,我的更新1。据我所知,现在的问题是通知。IsShiftLock调用Notify,但绑定应该如何订阅它?我是否正确,绑定应该以某种方式通知属性的更改?)当我调试时,我看到在通知(“IsShiftLock”)时没有人被订阅正在调用。@EngineersPack请添加
xaml
。我制作了样品溶液,它对我有效。