使用属性更改简单绑定到用户控件在 vs 扩展工具窗口中不起作用

Posted

技术标签:

【中文标题】使用属性更改简单绑定到用户控件在 vs 扩展工具窗口中不起作用【英文标题】:Simple binding to a user control using property change not works in vs extension tool window 【发布时间】:2021-11-26 17:25:21 【问题描述】:

我在 Vs 扩展中有一个 UserControl, 我想做一个属性绑定,但由于某种原因它不起作用

xaml

<UserControl x:Class="RemoteDebuggerToolBarExtension.Windows.CommandRunnerControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:vsshell="clr-namespace:Microsoft.VisualStudio.Shell;assembly=Microsoft.VisualStudio.Shell.15.0"
         xmlns:windows="clr-namespace:RemoteDebuggerToolBarExtension.Windows"
         Background="DynamicResource x:Static vsshell:VsBrushes.WindowKey"
         Foreground="DynamicResource x:Static vsshell:VsBrushes.WindowTextKey"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300"
         d:DataContext="d:DesignInstance windows:CommandRunnerControl"
         Name="MyToolWindow">
<Grid>
    <StackPanel Orientation="Vertical">
        <TextBlock Margin="10" >Type your command here:</TextBlock>
        <TextBox Margin="10" Width="200" TextWrapping="WrapWithOverflow" Text="Binding CommandData,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged "></TextBox>
        <Button Margin="10" Content="Run" Click="RunRemoteCommand"  Name="button1" />
    </StackPanel>
</Grid>

后面的代码

 namespace RemoteDebuggerToolBarExtension.Windows

 public partial class CommandRunnerControl : UserControl, INotifyPropertyChanged
 
    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));
    

在没有更新的情况下输入文本 我错过了什么?

【问题讨论】:

【参考方案1】:

设置DataContext或明确指定绑定源:

<TextBox Margin="10" Width="200" TextWrapping="WrapWithOverflow"
         Text="Binding CommandData,UpdateSourceTrigger=PropertyChanged, 
             RelativeSource=RelativeSource AncestorType=UserControl " />

【讨论】:

谢谢解决了,你是什么意思改变DataContext?你能解释一下上面的定义有什么问题吗? 您尚未在示例代码中的任何位置设置DataContext 不是 d:DataContext="d:DesignInstance windows:CommandRunnerControl" 定义它 没有。它定义了 design 时间DataContext,仅供 Visual Studio 中的设计器使用。它不适用于运行时。

以上是关于使用属性更改简单绑定到用户控件在 vs 扩展工具窗口中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当通过网络接收的数据更改属性时,如何将控件绑定到属性更改?

WPF中常用的表格控件都有哪些

如何正确绑定到 MVVM 框架中用户控件的依赖属性

vs2017关于SqlDataSource无法使用参数控件绑定的问题

将用户控件绑定到布尔属性的对面

自定义用户控件的 DependencyProperty 绑定未在更改时更新