我目前的问题是我的UI没有像我喜欢的那样更新,希望你能帮助我。
我有一个模拟的“2类继承”,如本页所推荐 http://www.codeproject.com/Articles/10072/Simulated-Multiple-Inheritance-Pattern-for-C
我的真实应用程序如下所示:
public class Item : INotifyPropertyChanged
{
private bool _isVisible;
public bool IsVisible
{
get
{
return _isVisible;
}
set
{
if (_isVisible == value)
return;
_isVisible = value;
OnPropertyChanged("IsVisible");
}
}
//NotifyPropertyChanged Implementation removed so the focus stays on problem...
}
public class ObjectItem : INotifyPropertyChanged
{
private bool _isExpanded;
public bool IsExpanded
{
get
{
return _isExpanded;
}
set
{
if (_isExpanded== value)
return;
_isExpanded= value;
OnPropertyChanged("IsExpanded");
}
}
//NotifyPropertyChanged Implementation removed so the focus stays on problem...
}
public class CombinedItem : Item
{
private readonly ObjectItem _objectItem = new ObjectItem();
public bool IsExpanded
{
get { return _objectItem.IsExpanded; }
set { _objectItem.IsExpanded = value; }
}
public static implicit operator ObjectItem(CombinedItem combinedItem)
{
return combinedItem._objectItem;
}
}
我现在面临的问题是,当我将CominedItem作为DataContext时,属性IsExpanded没有正确通知UI,IsVisible属性按预期工作。
为了解决这个问题,我将CominedItem更改为以下内容:
public class CombinedItem : Item
{
private readonly ObjectItem _objectItem = new ObjectItem();
public bool IsExpanded
{
get { return _objectItem.IsExpanded; }
set
{
if (_objectItem.IsExpanded == value)
return;
_objectItem.IsExpanded = value;
OnPropertyChanged("IsExpanded");
}
}
public static implicit operator ObjectItem(CombinedItem combinedItem)
{
return combinedItem._objectItem;
}
}
有没有办法避免再次使用这种方法编写OnPropertyChanged(“IsExpanded”)。 (我知道有一些库/工具,你根本不需要写它,只需要声明一个属性,请不要暗示那些)
答案 0 :(得分:1)
实际上你应该订阅ObjectItem PropertyChanged并在CombinedItem上引发匹配事件。
如果在不使用CombinedItem.IsExpanded的情况下修改了_objectItem.IsExpanded,则您的UI将看不到更改。
如果要包装属性,如果没有一些魔术属性/工具,则必须处理更改通知。
public class CombinedItem : Item
{
private readonly ObjectItem _objectItem = new ObjectItem();
public CombinedItem()
{
_objectItem.PropertyChanged += (s, e) =>
{
if (e.PropertyName == "IsExpanded")
OnPropertyChanged("IsExpanded");
}
}
public bool IsExpanded
{
get { return _objectItem.IsExpanded; }
set { _objectItem.IsExpanded = value; }
}
public static implicit operator ObjectItem(CombinedItem combinedItem)
{
return combinedItem._objectItem;
}
}
答案 1 :(得分:1)
您可以将ObjectItem公开为属性并绑定到该
public class CombinedItem : Item
{
private readonly ObjectItem _objectItem = new ObjectItem();
public bool IsExpanded
{
get { return _objectItem.IsExpanded; }
set { _objectItem.IsExpanded = value; }
}
public ObjectItem ObjectItem
{
get { return _objectItem; }
}
public static implicit operator ObjectItem(CombinedItem combinedItem)
{
return combinedItem._objectItem;
}
}
<Expander IsExpanded={Binding ObjectItem.IsExpanded}/>