ListView的ItemsSource绑定没有将更改推送到源

时间:2011-06-23 23:15:08

标签: wpf mvvm

我正在使用WPF和Mvvm,我的ListView将其ItemSource绑定到ICollectionView。如何处理选定的项目更改事件?

最初我有一个DataGrid的ItemSource绑定到相同的ICollectionView并设置集合的CurrentChanged事件。一切正常,但ListView不是这样。

2 个答案:

答案 0 :(得分:4)

正如Thomas所提到的,所有你需要做的就是将列表框的SelectedItem属性绑定到viewmodel中的属性。为了说清楚,这是一个例子。

这是我的观点

   <Grid x:Name="LayoutRoot" Background="White">
        <ListView ItemsSource="{Binding Contacts}" SelectedItem="{Binding SelectedContact, Mode=TwoWay}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>   

这是我的ViewModel

public class MainViewModel: ViewModelBase
{
    ObservableCollection<ContactViewModel> contacts;
    ContactViewModel selectedContact;

    public ContactViewModel SelectedContact
    {
        get { return selectedContact; }
        set {
            selectedContact = value;
            base.OnPropertyChanged("SelectedContact"); 
        }
    } 

    public ObservableCollection<ContactViewModel> Contacts
    {
        get { return contacts; }
        set { 
            contacts = value;
            base.OnPropertyChanged("Contacts"); 
        }
    }
}

每次尝试更改列表框中的选择时,您都会进入SelectedContact的设置器。

set 
{ 
     contacts = value;
     base.OnPropertyChanged("Contacts"); 
}

通过此,您将知道所选联系人已更改。

使用属性SelectedContact,您还将知道您的集合中的哪个项目已被选中。

如果要实现多个选择,还可以将ViewModel中的Collection属性绑定到ListView的SelectedItems属性。

答案 1 :(得分:3)

只需将SelectedItem的{​​{1}}绑定到ViewModel的属性