我想创建一个通用的ObservableItem类,我想了解如何实现它。 我希望它是通用的,以便我可以使用它与所有类型的类型(如果可能的话)。 我想要创建它的原因是能够将多个控件绑定到数组,而不是为每个绑定创建属性。 (我想要一个双向绑定,以便当源更新时,控件将通过PropertyChanged事件通知)。 我开始创建类,但我不知道要添加什么实现才能使其对于每种类型的用途都是通用的。创建一个通用的ObservableItem类
public struct ObservableItem<T> : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private T _item;
private T Item
{
get {
return _item;
}
set
{
_item = value;
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(_item.ToString()));
}
}
public static implicit operator T(ObservableItem<T> value)
{
return value.Item;
}
public static implicit operator ObservableItem<T>(T value)
{
var ret = new ObservableItem<T>();
ret.Item = value;
return ret;
}
}
我想用来与假设是适用于一切类:
ObservableItem<int> value1 = 5;
ObservableItem<int>[] aValue = new ObservableItem<int>[5];
aValue[0] = 4;
aValue[1] = 5;
aValue[2] = aValue[0] + aValue[1];
aValue[3] = aValue[0] * aValue[1];
ObservableItem<bool> value2;
value2 = !value2;
ObservableItem<bool>[] Channels = new ObservableItem<bool>[4];
// and more uses
XAML绑定:提前
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="0,0,0,10">
<CheckBox IsChecked="{Binding Channels[0]}" Content="Channel 1" Style="{StaticResource Channels}"></CheckBox>
<CheckBox IsChecked="{Binding Channels[1]}" Content="Channel 2" Style="{StaticResource Channels}"></CheckBox>
<CheckBox IsChecked="{Binding Channels[2]}" Content="Channel 3" Style="{StaticResource Channels}"></CheckBox>
<CheckBox IsChecked="{Binding Channels[3]}" Content="Channel 4" Style="{StaticResource Channels}"></CheckBox>
</StackPanel>
感谢。
'PropertyChanged'必须通过物业呐,E。 – SLaks 2015-03-02 19:17:44
由于SLak错过了5分钟的编辑窗口:必须通过属性*名称*传递'PropertyChanged'。 – 2015-03-02 19:27:17
'if(_item == null)_item = default(T);'行没有意义。如果'T'是一个值类型,那么'_item == null'将是错误的。如果'T'是一个引用类型,那么'default(T)'将是'null'。 – juharr 2015-03-02 19:32:23