Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在已设置datatemplate的绑定wpf列表框中,项值不更新_C#_Wpf_Binding_User Controls_Listbox - Fatal编程技术网

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

    } 
}