VS扩展工具窗口中用户控件属性变更通知绑定不生效问题
问题原因与修复方案
核心问题
你在XAML中定义的d:DataContext="{d:DesignInstance windows:CommandRunnerControl}"属于仅设计时生效的配置,运行时没有给控件指定实际的DataContext,绑定找不到对应的数据源,自然不会触发属性更新。
修复方法(二选一即可)
方案1:在控件构造函数中指定运行时DataContext
因为你直接把INotifyPropertyChanged逻辑写在了UserControl本身,直接在构造函数中将控件自身设为DataContext即可:
namespace RemoteDebuggerToolBarExtension.Windows { public partial class CommandRunnerControl : UserControl, INotifyPropertyChanged { public CommandRunnerControl() { InitializeComponent(); // 新增这行代码指定运行时数据源 this.DataContext = this; } // 其余原有代码保持不变 private string _commandData = string.Empty; public event PropertyChangedEventHandler PropertyChanged; public string CommandData { get => _commandData; set { _commandData = value; OnPropertyChanged(nameof(CommandData)); } } protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
方案2:绑定指定ElementName跳过DataContext依赖
如果你不想修改DataContext配置,可以直接给TextBox的绑定指定当前UserControl的名称,不需要依赖DataContext继承:
<TextBox Margin="10" Width="200" TextWrapping="WrapWithOverflow" Text="{Binding CommandData,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, ElementName=MyToolWindow }"> </TextBox>
此处的MyToolWindow就是你在UserControl根节点上定义的Name属性值。
额外校验点
- 确认你已经引用了两个必要命名空间:
System.ComponentModel(INotifyPropertyChanged相关)、System.Runtime.CompilerServices(CallerMemberName特性相关) - 确认父级控件没有手动覆写DataContext,避免继承的DataContext覆盖当前控件的配置
内容的提问来源于stack exchange,提问作者Michael Gabbay
相关产品推荐
相关产品推荐

