WPF PropertyChanged 事件未触发/更新文本框
Posted
技术标签:
【中文标题】WPF PropertyChanged 事件未触发/更新文本框【英文标题】:WPF PropertyChanged event not firing/updating textbox 【发布时间】:2021-11-27 22:53:56 【问题描述】:我对 wpf 中的数据绑定还比较陌生,但是尽管在这里和其他地方浏览了所有关于可能出现问题的文章和帖子,但我仍然没有找到解决方案。下面的代码是从我的大文件中解析出来的流行信息。
我已确保其他一切正常,包括添加一个属性以检索受保护的参数 options
以确保 options.FullPath
实际上在浏览按钮的 Click
事件上得到设置/更改。我尝试在主窗口中订阅PropertyChanged
事件,其中test.PropertyChanged += ShowMessage;
、ShowMessage
是一种触发带有文本的MessageBox
的方法。我尝试了OnPropertyChanged
方法的多种变体,从在调用方法中硬编码到此处显示的内容。我什至尝试将options
设置为默认值""
,以防万一这很奇怪。任何事情都没有运气,我目前无法获得 C#6,所以很可能我所拥有的内容适用于正确的语言更新,但我无法确定,因为它不会触发。
任何帮助或见解将不胜感激!
编辑:以下所有代码都位于同一命名空间内。
对象类:
public class EEOptionSet: INotifyPropertyChanged
public EEOptionSet()
public event PropertyChangedEventHandler PropertyChanged;
private string _fullPath;
public string FullPath
get return _fullPath;
set
if (value != _fullPath)
_fullPath = value;
OnPropertyChanged();
protected void OnPropertyChanged([CallerMemberName] string name = null)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
主窗口后面的代码:
public partial class window : Window
protected EEOptionSet options = new EEOptionSet();
private void BrowseFiles(object sender, RoutedEventArgs e)
options.FullPath = "Test";
我的主窗口的 xaml 中的文本框和按钮实例(为简洁起见,删除了网格位置、对齐等无关属性):
<TextBox x:Name="FullPathText" Text="Binding (options.FullPath), Mode=OneWay, UpdateSourceTrigger=PropertyChanged" IsReadOnly="True" Focusable="False"/>
<uc:ButtonExt x:Name="Browse" Content="..." Click="BrowseFiles"/>
注意:我也试过:
Text="Binding options.FullPath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged"
Text="Binding Path=options.FullPath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged"
Text="Binding Path=(_currentOptionSet.FullPath), Mode=OneWay, UpdateSourceTrigger=PropertyChanged"
以及没有IsReadOnly
和Focusable
属性。
【问题讨论】:
IDE 的输出窗口是否存在绑定错误? 我构建解决方案时没有。它只是说“开始”、“正在编译...”和“构建成功完成”。 抱歉,我应该指定在执行期间显示绑定错误。 【参考方案1】:您不能绑定到受保护的字段。
将窗口的DataContext
设置为你的字段:
public partial class window : Window
protected OptionSet options = new OptionSet();
public window()
InitializeComponent();
DataContext = options;
private void BrowseFiles(object sender, RoutedEventArgs e)
options.FullPath = "Test";
...并从 XAML 标记中的绑定路径中删除“选项”:
Text="Binding FullPath, UpdateSourceTrigger=PropertyChanged"
或者,将options
设为窗口的公共属性,并将DataContext
设置为窗口本身:
public partial class window : Window
public OptionSet options get; private set;
public window()
InitializeComponent();
options = = new OptionSet();
DataContext = this;
private void BrowseFiles(object sender, RoutedEventArgs e)
options.FullPath = "Test";
那么你应该保持绑定路径不变:
Text="Binding options.FullPath, UpdateSourceTrigger=PropertyChanged"
【讨论】:
对于第一个选项,如果有多个某种类型的字段(并非所有字段都是文本框)来提供用户控制,那么将DataContext
设置为选项会有问题,对吗?我已经测试了第二个选项,并对我发现错误的代码的另一部分进行了调整(我首先这样做了,但没有你的解决方案仍然无法工作),我让它工作了。【参考方案2】:
PropertyPath(这是 Binding.Path 属性的类型)只能由源的公共属性的路径表达式设置。而你的变量options
是一个受保护的字段。
如果在 Binding 中没有明确指定源(有三种设置方式:Source、ElementName 和RelativeSource),则使用设置绑定的元素的数据上下文作为源。您没有以这四种方式中的任何一种方式指定来源。
设置数据上下文及其使用的示例。 根据假设编写:
EEOptionSet
和 OptionSet
类是同一个类,只是复制代码时出错了;
EEOptionSet
类与您的 window
在同一命名空间中声明。
<Window.DataContext>
<local:EEOptionSet/>
<Window.DataContext>
protected readonly EEOptionSet options;
public window()
InitializeComponent();
options = (EEOptionSet) DataContext;
<TextBox Text="Binding FullPath, Mode=OneWay"
IsReadOnly="True"
Focusable="False"/>
【讨论】:
抱歉,您的假设是正确的。也就是说,我尝试了你所拥有的,但在尝试将 DataContext 转换为 EEOptionSet 时出现转换错误。 EEOptionSet 没有实现 Window,我假设这就是为什么? 你的解释不足以理解你失败的原因。您能否为您尝试的窗口做一个简单的速记示例。然后列出完整的代码(XAML 和代码隐藏)。以上是关于WPF PropertyChanged 事件未触发/更新文本框的主要内容,如果未能解决你的问题,请参考以下文章
单击DataGrid行中的复选框时触发PropertyChanged事件
仅在 C#/WPF 中的给定时间内未触发事件时才执行事件 [重复]
FileSystemWatcher 事件未在 WPF 应用程序中触发