WPF绑定列表元组

WPF绑定列表元组,wpf,data-binding,Wpf,Data Binding,我的目标是绑定到WPF中的一组对象。我第一次尝试使用泛型,但却失败了。由于我无法将泛型属性强制转换为INotifyProperty接口,因此无法连接changedevent 因此,我提出了这个类作为绑定列表中的对象。(是的,当列表中的对象发生更改时,我需要这些通知)。所以我需要你的意见,改进我的代码 public class GPair : ObservableObject { public GPair() { } private ObservableObjec

我的目标是绑定到WPF中的一组对象。我第一次尝试使用泛型,但却失败了。由于我无法将泛型属性强制转换为INotifyProperty接口,因此无法连接changedevent

因此,我提出了这个类作为绑定列表中的对象。(是的,当列表中的对象发生更改时,我需要这些通知)。所以我需要你的意见,改进我的代码

public class GPair : ObservableObject
{
    public GPair()
    {
    }

    private ObservableObject _first;
    public ObservableObject First
    {
        get
        {
            return this._first;
        }
        set
        {
            this._first = value;
            ((ObservableObject)value).PropertyChanged +=new PropertyChangedEventHandler(First_PropertyChanged);
            RaisePropertyChanged("First");
        }
    }
    private ObservableObject _second;
    public ObservableObject Second
    {
        get
        {
            return this._second;
        }
        set
        {
            this._second = value;
            ((ObservableObject)value).PropertyChanged += new PropertyChangedEventHandler(Second_PropertyChanged);
            RaisePropertyChanged("Second");
        }
    }

    private void First_PropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        RaisePropertyChanged("First");
    }
    private void Second_PropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        RaisePropertyChanged("Second");
    }
}
ObserveObject只是一个实现INotifyPropertyChanged的Helper类

这段代码允许我在一个绑定中耦合两个对象。。。绑定本身如下所示:

<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding Path=First.ObjectPropertie}" />
    <TextBlock Text="{Binding Path=Second.ObjectPropertie}" />
</StackPanel>

有什么意见或改进吗


亲切的问候

我没有完全理解您想要实现的目标,但是GPair类看起来很奇怪

吃点这样的怎么样

  public class ObservablePair : INotifyPropertyChanged
  {
        public event PropertyChangedEventHandler PropertyChanged;

        private MyObject m_First;
        public MyObject First
        {
            get { return m_First; }
            set
            {
                m_First = value;
                OnPropertyChanged("First");
            }

        }

        private MyObject m_Second;
        public MyObject Second
        {
            get { return m_Second; }
            set
            {
                m_Second = value;
                OnPropertyChanged("Second");
            }
        }

        public void OnPropertyChanged(string propertyName)
        {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null) handler(this, new 
                    PropertyChangedEventArgs(propertyName)); ;
        }
 }

HTH

我没有完全理解您想要实现的目标,但是GPair类看起来很奇怪

吃点这样的怎么样

  public class ObservablePair : INotifyPropertyChanged
  {
        public event PropertyChangedEventHandler PropertyChanged;

        private MyObject m_First;
        public MyObject First
        {
            get { return m_First; }
            set
            {
                m_First = value;
                OnPropertyChanged("First");
            }

        }

        private MyObject m_Second;
        public MyObject Second
        {
            get { return m_Second; }
            set
            {
                m_Second = value;
                OnPropertyChanged("Second");
            }
        }

        public void OnPropertyChanged(string propertyName)
        {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null) handler(this, new 
                    PropertyChangedEventArgs(propertyName)); ;
        }
 }

以下是我对答案的看法:

public class ObservablePair<T1, T2> : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private T1 _item1;
    public T1 Item1
    {
        get => _item1;
        set => OnPropertyChanged(nameof(Item1), _item1 = value);
    }

    private T2 _item2;
    public T2 Item2
    {
        get => _item2;
        set => OnPropertyChanged(nameof(Item2), _item2 = value);
    }

    public void OnPropertyChanged<T>(string propertyName, T _)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public类observePair:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私人T1_项目1;
公共T1项目1
{
get=>\u item1;
set=>OnPropertyChanged(nameof(Item1),\u Item1=value);
}
私人T2_项目2;
公共T2项目2
{
get=>\u item2;
set=>OnPropertyChanged(nameof(Item2),\u Item2=value);
}
public void OnPropertyChanged(字符串propertyName,T\ux)
=>PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}

以下是我对答案的看法:

public class ObservablePair<T1, T2> : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private T1 _item1;
    public T1 Item1
    {
        get => _item1;
        set => OnPropertyChanged(nameof(Item1), _item1 = value);
    }

    private T2 _item2;
    public T2 Item2
    {
        get => _item2;
        set => OnPropertyChanged(nameof(Item2), _item2 = value);
    }

    public void OnPropertyChanged<T>(string propertyName, T _)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public类observePair:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私人T1_项目1;
公共T1项目1
{
get=>\u item1;
set=>OnPropertyChanged(nameof(Item1),\u Item1=value);
}
私人T2_项目2;
公共T2项目2
{
get=>\u item2;
set=>OnPropertyChanged(nameof(Item2),\u Item2=value);
}
public void OnPropertyChanged(字符串propertyName,T\ux)
=>PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}

例如,我从两个对象获得了信息,我想在一个列表/datagrid/etc中显示这些信息。。。任何能够显示列表的控件。但我只能将该控件的datacontext设置为1个对象。所以我需要一种“元组”,但要实现可变数据和INotifyPropertyChanged。你的代码和我的几乎一模一样。只有PropertyChanged内容在我继承的ObserveObject类中。但是看看你的回答。。看来我走得很好……)干杯:)例如,我从两个对象获得了信息,我想在一个列表/datagrid/etc中显示它们。。。任何能够显示列表的控件。但我只能将该控件的datacontext设置为1个对象。所以我需要一种“元组”,但要实现可变数据和INotifyPropertyChanged。你的代码和我的几乎一模一样。只有PropertyChanged内容在我继承的ObserveObject类中。但是看看你的回答。。看来我走得很好……)干杯:)在你的版本中,这也是不正确的。1) 您没有对事件的取消订阅,这就是为什么在应用程序结束之前,所有以前的值都将保留在内存中的原因。2) 也没有检查null-因此,在分配null时将引发异常。3) 向ObservieObject施加价值也是无稽之谈。此类型的值已存在。在您的版本中,此操作也不正确。1) 您没有对事件的取消订阅,这就是为什么在应用程序结束之前,所有以前的值都将保留在内存中的原因。2) 也没有检查null-因此,在分配null时将引发异常。3) 向ObservieObject施加价值也是无稽之谈。此类型的值已存在。