如何通知ViewModel在View C#中更改的集合的值

时间:2014-11-05 14:06:24

标签: c# mvvm

我的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对象我改变了!!我不想比较原始集合和新集合来获得它。有什么方法可以解雇一个事件或其他很长的路线。

由于

1 个答案:

答案 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;参加活动。