Wpf 如何在代码中创建绑定并从属性发出通知?
视图包含两个按钮。 在ViewModel中,“IsShiftLock”属性驻留并动态创建绑定Wpf 如何在代码中创建绑定并从属性发出通知?,wpf,xaml,binding,Wpf,Xaml,Binding,视图包含两个按钮。 在ViewModel中,“IsShiftLock”属性驻留并动态创建绑定 public bool IsShiftLock { get { return _isShiftLock; } set { if (value != _isShiftLock) { _isShiftLock = value; Notify("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
。我制作了样品溶液,它对我有效。