c# - WPF PropertyChanged 事件未触发/更新文本框
问题描述
我对 wpf 中的数据绑定还比较陌生,但是尽管在这里和其他地方浏览了所有关于可能出错的文章和帖子,但我仍然没有找到解决方案。下面的代码是从我的较大文件中解析出来的流行信息。
我已确保其他一切正常,包括添加一个属性来检索受保护的参数options
,以确保options.FullPath
实际上在浏览按钮的Click
事件中设置/更改。我尝试PropertyChanged
使用 line 订阅主窗口中的事件,这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
andFocusable
属性。
解决方案
PropertyPath(这是 Binding.Path 属性的类型)只能由源的公共属性的路径表达式设置。你的变量
options
是一个受保护的字段。如果在 Binding 中没有显式指定源(有三种设置方式:Source、ElementName 和 RelativeSource),则使用设置绑定的元素的数据上下文作为源。您没有以这四种方式中的任何一种方式指定来源。
设置数据上下文及其使用的示例。
根据假设写:
- the
EEOptionSet
和OptionSet
classes - 是一回事,你只是在复制代码时犯了一个错误; - 该类
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"/>
推荐阅读
- python - TypeError:owlready 库中的预期字符串或类似字节的对象
- node.js - 无法在 ubuntu 18.04 上运行 mongo
- python - 我们如何进行可以制作绘图/符号的特定输入?
- python - 有没有办法限制 Python SEaborn 条形图(或任何图表)的结果数量?
- php - 如何在 URL 上显示消息对话用户名和用户表中的个人资料图片显示
- google-apps-script - 在 Google 工作表中插入图像,并使用工作表中的自定义功能
- wordpress - 如何找到导航菜单和菜单按钮的 CSS 选择器?
- c# - 从数据库中的数据运行大量活动函数
- sql-server - 将文件传输到 AWS S3 时出现奇怪的 SQL Server 减速
- mysql - 如何运行意外删除表的特定迁移