我的View中有ListView,其itemsSource绑定到Observable集合。这是我的看法
<ListView x:Name="Details"
ItemsSource="{Binding Details}"
Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="3">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Background="White" Width="350">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="175"/>
<ColumnDefinition Width="175"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0"
Grid.Column="0"
Text="{Binding Key}"/>
<TextBox Grid.Row="0"
Grid.Column="1"
Text="{Binding Value}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
问题:当我运行我的应用程序并更改我的TextBox值时,如何在我的viewModel中获得仅包含这些更改的新集合?我想要一组我已经改变的值。目前,我得到了一些我已经改变的值和旧值。这是我的MainViewModel:
private ObservableCollection<Details> _details;
public ObservableCollection<Details> Details
{
get { return _details; }
set
{
_details= value;
RaisePropertyChanged();
}
}
public MainViewModel()
{
Details= new ObservableCollection<Details>
{
new Details() {Key = "age", Value = 25},
new Details() {Key = "sex", Value = "female"},
new Details() {Key = "height", Value = 3}
};
}
详细信息类:
public class Details
{
public string Key { get; set; }
public object Value { get; set;}}
在上面的代码中,如果我将年龄改为20 ,,,我会得到一个集合:( 20岁,性别女性,身高3) 但我只想要(20岁),即textBox的Details对象我改变了!!我不想比较原始集合和新集合来获得它。有什么方法可以解雇一个事件或其他很长的路线。
由于
答案 0 :(得分:0)
您需要为ObservableCollection CollectionChanged事件连接一个事件处理程序。然后处理程序将传递给它一个EventArguments: http://msdn.microsoft.com/en-us/library/system.collections.specialized.notifycollectionchangedeventargs(v=vs.110).aspx
请注意,您可以根据自己的要求查看新项目。
这篇文章展示了如何做到这一点的非常明确的例子......
Notify ObservableCollection when Item changes
现在,如果您想深入了解并获得其中一个已更改的属性值,则需要在Details类中实现自己的通知系统。有很多方法可以做到这一点,其中一个是臭名昭着的DepedencyProperty本身,它有很多变化的钩子。但您可以简单地将EventHanlder或通用EventHandler实现为类定义中的静态变量。这允许其他类来“连接”#34;参加活动。