Снимите флажок WPF DataGrid при изменении ItemsSource

У меня в 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. На мой взгляд, я изменяю привязку источника моего datagrid из моей ViewModel. Теперь проблема в том, что каждый раз, когда ItemsSource изменяется, запускается событие SelectionChanged, выбирая первый элемент в DataGrid; за этим следует представление, загружающее пользовательский элемент управления без явного выбора пользователем строки DataGrid. Как я могу запретить DataGrid выбирать любую строку при изменении ItemsSource?

Упрощенный демонстрационный код:

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>

ViewModel:

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"}
        };
    }
}

person Lucifer    schedule 19.08.2014    source источник
comment
перед изменением ItemsSource сделайте ItemsSource = null, а затем измените его   -  person Rang    schedule 19.08.2014
comment
1. Измените ItemsSource. 2. Установите DataGrid.SelectedItem на null.   -  person Sheridan    schedule 19.08.2014


Ответы (1)


Вам следует:

1. Добавьте SelectedItem Binding в свой DataGrid:

SelectedItem="{Binding Selected, Mode=TwoWay}"

2. Иметь соответствующее свойство (конечно, стрелять PropertyChanged)

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

3. Установите для него значение null в Itemssource сеттере (или перед его изменением)

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

Должен сделать свое дело.

person Damascus    schedule 19.08.2014
comment
твой трюк не сработал в моем демонстрационном приложении. Ознакомьтесь с моим обновленным вопросом. Когда я запускаю ChangeItemsSourceCmd, TextBlock в View привязывается к первой строке DG, которая является первым элементом нового Source. - person Lucifer; 20.08.2014