0

似乎我对绑定做了一些扭曲,但经过大量尝试和研究后,我仍然没有找到原因(我发现的所有示例都与我的实现非常相似,以至于我看不出我做错了什么),你能帮我吗?

我有一个名为的类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<GlobalConfig>绑定到一个ListBox(通过设置DataContext列表框的属性),我有这个列表框的DataTemplate:

<DataTemplate>
     <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>

我还有一个名为的用户控件GlobalConfigUI,它绑定到DataContext列表框(使用 ElementName)。

这里一切正常,但是当我更改配置的名称时,列表框中没有任何变化...我检查并知道PropertyChanged名称设置器中的处理程序被调用,对象也GlobalConfig被更新,但列表框仍然显示旧的姓名...

GlobalConfigUI是绑定到列表框的 DataContext 的方式:

<my:GlobalConfigUI x:Name="globalConfigUI1" DataContext="{Binding ElementName=settingsListBox, Path=SelectedValue, Mode=TwoWay}" />

下面是 GlobalConfigUI 控件中的 TextBox 绑定到 Name 属性的方式:

<TextBox Name="configNameTextBox" Text="{Binding Path=Name, Mode=TwoWay, BindsDirectlyToSource=True}" MinWidth="380" />

我对 WPF 并不完全陌生,但我只使用了 2 或 3 次,所以我认为这里一定有某种新手错误,有什么提示吗?

4

1 回答 1

1

作为第一句话,TextBox通过添加来更改您的绑定UpdateSourceTrigger=PropertyChanged。还有关于BindsDirectlyToSource,我很少用。删除它并再次检查

此外,将您的实现更改为

private string _name;
public string Name 
{ 
    get { return _name; } 
    set 
    {
        _name = value;
        if (_name != value && PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("Name"));

    } 
}
于 2013-01-24T17:47:14.623 回答