在ItemsSource更改时取消选择WPF DataGrid

时间:2014-08-19 07:35:23

标签: wpf datagrid itemssource selectionchanged

我在WPF中有以下DataGrid:

<DataGrid x:Name="dgPatientMedicationOrderList" Width="Auto" HorizontalAlignment="Stretch" RowHeight="40" Background="Transparent" HorizontalContentAlignment="Left" 
                      GridLinesVisibility="None" RowHeaderWidth="0" VirtualizingStackPanel.VirtualizationMode="Standard" SelectedIndex="-1" 
                      ScrollViewer.HorizontalScrollBarVisibility="Disabled" AutoGenerateColumns="False" SelectionMode="Single"
                      IsSynchronizedWithCurrentItem="True" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Stretch" IsReadOnly="True"
                      ItemsSource="{Binding PatientOrdersCollectionView}">

当用户单击DataGrid中的某一行时,会触发SelectionChanged事件,并且绑定的ViewModel命令会驱动View以加载与DG行对应的另一个用户控件。在我看来,我正在从我的ViewModel更改datagrid的源绑定。现在的问题是,每次更改ItemsSource时,选择DataGrid中的第一个项目就会触发SelectionChanged事件;接下来是加载用户控件的视图,而无需用户明确选择DataGrid行。如何更改ItemsSource时,如何阻止DataGrid选择任何行?

简化的演示代码:

XAML:

                                                                                                               

    <Button Content="Change Source" Command="{Binding ChangeItemsSourceCmd}" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20" />
    <StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Left" Orientation="Vertical">
        <TextBlock Text="{Binding SelectedPerson.Id, StringFormat=ID: {0}}" />
        <TextBlock Text="{Binding SelectedPerson.Name, StringFormat=Name: {0}}" />
        <TextBlock Text="{Binding SelectedPerson.Gender, StringFormat=Gender: {0}}" />
        <TextBlock Text="{Binding SelectedPerson.Country, StringFormat=Country: {0}}" />
    </StackPanel>
</Grid>

视图模型:

public class WindowViewModel : ViewModelBase
{
    private Person _selectedPerson;
    private ObservableCollection<Person> _personList;

    public Person SelectedPerson
    {
        get { return _selectedPerson; }
        set { RaisePropertyChange<Person>(() => SelectedPerson, ref _selectedPerson, ref value); }
    }
    public ObservableCollection<Person> PersonList
    {
        get { return _personList; }
        set
        {
            SelectedPerson = null;
            RaisePropertyChange<ObservableCollection<Person>>(() => PersonList, ref _personList, ref value);
        }
    }

    public WindowViewModel()
    {
        PersonList = new ObservableCollection<Person>()
        {
            new Person() { Id=101, Name="Mahesh", Gender="Male", Country="India"},
            new Person() { Id=102, Name="Srinivas", Gender="Male", Country="Sri Lanka"},
            new Person() { Id=103, Name="Isha", Gender="Female", Country="United States"},
            new Person() { Id=104, Name="Salim", Gender="Male", Country="Pakistan"}
        };
    }

    public ICommand ChangeItemsSourceCmd
    {
        get
        {
            return new RelayCommand(ChangeItemsSourceCmdHandler);
        }
    }

    private void ChangeItemsSourceCmdHandler()
    {
        PersonList = new ObservableCollection<Person>()
        {
            new Person() { Id=105, Name="Raman", Gender="Male", Country="Uganda"},
            new Person() { Id=106, Name="Anurag", Gender="Male", Country="England"},
            new Person() { Id=107, Name="Komal", Gender="Female", Country="Thailand"},
            new Person() { Id=108, Name="Nitin", Gender="Male", Country="Africa"}
        };
    }
}

1 个答案:

答案 0 :(得分:0)

你应该:

1.在SelectedItem

中添加DataGrid绑定
SelectedItem="{Binding Selected, Mode=TwoWay}"

2.拥有相关属性(当然解雇PropertyChanged

public object Selected
{
  get { return selected; }
  set
  {
    selected = value;
    OnPropertyChanged("Selected");
  }
}

3.在Itemssource setter中(或在更改之前)将其设置为null

public IEnumerable PatientOrdersCollectionView
{
  get { return patientOrdersCollectionView; }
  set
  {
    Selected = null; // Put it to null here to unselect it from grid
    patientOrdersCollectionView = value;
    OnPropertyChanged("PatientOrdersCollectionView");
  }
}

应该做的伎俩。