C# 在已设置datatemplate的绑定wpf列表框中,项值不更新
似乎我对绑定做了一些修改,但是经过大量的尝试和研究,我仍然没有找到原因(我发现的所有示例都与我的实现非常相似,以至于我看不出我做错了什么),你能帮我解决这个问题吗 我有一个名为C# 在已设置datatemplate的绑定wpf列表框中,项值不更新,c#,wpf,binding,user-controls,listbox,C#,Wpf,Binding,User Controls,Listbox,似乎我对绑定做了一些修改,但是经过大量的尝试和研究,我仍然没有找到原因(我发现的所有示例都与我的实现非常相似,以至于我看不出我做错了什么),你能帮我解决这个问题吗 我有一个名为GlobalConfig的类,它实现了INotifyPropertyChanged,并有一个名为Name的属性 public class GlobalConfig : XmlSoftLinkSerializer, INotifyPropertyChanged { private string _name;
GlobalConfig
的类,它实现了INotifyPropertyChanged
,并有一个名为Name的属性
public class GlobalConfig : XmlSoftLinkSerializer, INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value && PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
_name = value;
}
}
ObservableCollection
绑定到ListBox
(通过设置ListBox的DataContext
属性),我为ListBox创建了以下数据模板:
<DataTemplate>
<TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
下面是GlobalConfigUI控件内的文本框如何绑定到Name属性:
<TextBox Name="configNameTextBox" Text="{Binding Path=Name, Mode=TwoWay, BindsDirectlyToSource=True}" MinWidth="380" />
我对WPF并不完全陌生,但我只使用过两三次,所以我认为这里肯定有一些新的错误,有什么提示吗?首先,通过添加
UpdateSourceTrigger=PropertyChanged
来更改您的TextBox
绑定。同样关于BindsDirectlyToSource
,我很少使用它。将其拆下,然后再次检查
另外,将您的实现更改为
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
if (_name != value && PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
INotifyPropertyChanged是如何实现的?你能为你的名字属性发布部分代码吗。我发现这个bug就在那里。谢谢你看这个,刚刚发布的代码看起来不错。我用另一种方式做的唯一一件事是首先写_name=value;然后调用PropertyChanged。检查我发布的答案。如果未在文本框中设置,则会在losefocusI上触发UpdateSourceRigger。我绝望地尝试了
BindsDirectlyToSource
,甚至不知道它是做什么的!我换了它,现在它几乎可以正常工作了,谢谢!只有一件事:当我更改文本时,列表框中似乎缺少一个字符,例如,如果我键入“test”,列表框会显示“tes”,顺便问一下,您的回答是否意味着只应在实际更改值的控件上设置UpdateSourceTrigger=PropertyChanged
?我想既然我在TextBlock
上设置了UpdateSourceTrigger
,它就应该监听GlobalConfig
类的PropertyChanged
事件……好吧,现在我也可以尝试BindsDirectlyToSource
了,但我也会将UpdateSourceTrigger=PropertyChanged添加到GlobalConfigUI数据上下文绑定中(没有太多希望)。尝试更改Name的set函数中的顺序,首先分配值,然后引发PropertyChanged事件。(这更有希望)在问这个lol之前应该多考虑一下!在设置值之前触发PropertyChanged
事件没有太多机会起作用…再次感谢,现在一切都很好!关于你问的另一件事,我倾向于按你说的方式使用它。无论是绑定的还是可编辑的文本框、组合框、复选框,我都将其设置为UpdateSourceTrigger=PropertyChanged
。这不是我在什么地方读过的一般规则
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
if (_name != value && PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}