1

一个视图包含几个按钮。在 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));
}

}

       Binding b2 = new Binding {
                    Source = this,
                    Path = new PropertyPath("IsShiftLock"),
                    Converter = new ShiftLockToTextConverter()
                };
                b2.Mode = BindingMode.OneWay;
                curKeyView.Button.SetBinding(ContentControl.ContentProperty, b2);

IsShiftLock 正确更改,但转换器调用仅发生一次。据我了解,绑定应适当通知更改。如何做到这一点?

更新1:

视图面:

private readonly KeyboardViewModel viewModel;
public static KeyboardViewModel ViewModelInstance;

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

            viewModel = new KeyboardViewModel();
            DataContext = viewModel;

            ViewModelInstance = viewModel;
    }
4

2 回答 2

1

问题在于绑定Source属性。您应该将其设置为任何一个this.DataContext或其他一些来源,它会起作用。

            Binding b2 = new Binding {
                Source = this.DataContext,
                Path = new PropertyPath("IsShiftLock"),
                Converter = new ShiftLockToTextConverter()
            };
于 2013-10-22T13:38:36.547 回答
0

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

每个 KeyViewModel 都明确订阅了 PropertyChangedEvent,因此,不知何故,我尝试为 Shift 按钮和 Caps Lock 动态设置的绑定被击倒或其他原因。不幸的是,我不了解引擎盖下的整体情况。

于 2013-10-24T04:41:27.800 回答