WPF PropertyChanged 事件不是 firing/updating 文本框

WPF PropertyChanged event not firing/updating textbox

我对 wpf 中的数据绑定还比较陌生,但尽管仔细阅读了此处和其他地方的所有文章和帖子,了解可能存在的问题,但我仍然没有找到解决方案。下面的代码是从我的大文件中解析出的普遍信息。

我已确保其他一切正常,包括添加 属性 以检索受保护的参数 options 以确保 options.FullPath 实际上在 set/changed浏览按钮的 Click 事件。我试图订阅主 window 中的 PropertyChanged 事件,行 test.PropertyChanged += ShowMessage;ShowMessage 是一种触发带有文本的 MessageBox 的方法。我尝试了 OnPropertyChanged 方法的多种变体,从在调用方法中对其进行硬编码到此处显示的内容。我什至尝试将 options 设置为默认值 "" 以防万一这很奇怪。没有任何运气,我目前没有办法获得 C#6,所以很可能是我所拥有的与正确的语言更新一起工作,但我无法判断,因为它不会触发。

任何帮助或见解将不胜感激!

编辑:以下所有代码都在同一个命名空间中。

对象Class:

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));
    }

}

主要window的隐藏代码:

public partial class window : Window
{
    protected EEOptionSet options = new EEOptionSet();

    private void BrowseFiles(object sender, RoutedEventArgs e)
    {
        options.FullPath = "Test";
    }
}

我的主 window 的 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}"

以及没有 IsReadOnlyFocusable 属性。

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

  2. 如果Binding中没有明确指定source(有三种设置方式:Source、ElementName和RelativeSource),则设置了binding的元素的Data Context为用于源。您没有通过这四种方式中的任何一种方式指定来源。

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

  • EEOptionSetOptionSetclass是一回事,只是你复制代码的时候出错了;
  • EEOptionSet class 在与您的 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"/>

您不能绑定到受保护的字段。

将 window 的 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 成为 window 的 public 属性 并设置 DataContext window 本身:

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}"