首页 > 解决方案 > 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}"

以及没有IsReadOnlyandFocusable属性。

标签: c#wpfdata-bindingtextboxinotifypropertychanged

解决方案


  1. PropertyPath(这是 Binding.Path 属性的类型)只能由源的公共属性的路径表达式设置。你的变量options是一个受保护的字段。

  2. 如果在 Binding 中没有显式指定源(有三种设置方式:Source、ElementName 和 RelativeSource),则使用设置绑定的元素的数据上下文作为源。您没有以这四种方式中的任何一种方式指定来源。

设置数据上下文及其使用的示例。
根据假设写:

  • theEEOptionSetOptionSetclasses - 是一回事,你只是在复制代码时犯了一个错误;
  • 该类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"/>

推荐阅读