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}"
以及没有 IsReadOnly
和 Focusable
属性。
PropertyPath(这是Binding.Path属性的类型)只能通过路径表达式设置到public属性的来源。你的变量 options
是一个受保护的字段。
如果Binding中没有明确指定source(有三种设置方式:Source、ElementName和RelativeSource),则设置了binding的元素的Data Context为用于源。您没有通过这四种方式中的任何一种方式指定来源。
设置数据上下文的示例及其使用。
根据假设编写:
EEOptionSet
和OptionSet
class是一回事,只是你复制代码的时候出错了;
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}"
我对 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}"
以及没有 IsReadOnly
和 Focusable
属性。
PropertyPath(这是Binding.Path属性的类型)只能通过路径表达式设置到public属性的来源。你的变量
options
是一个受保护的字段。如果Binding中没有明确指定source(有三种设置方式:Source、ElementName和RelativeSource),则设置了binding的元素的Data Context为用于源。您没有通过这四种方式中的任何一种方式指定来源。
设置数据上下文的示例及其使用。
根据假设编写:
EEOptionSet
和OptionSet
class是一回事,只是你复制代码的时候出错了;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}"