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