WPF Datagrid selecteditem = null в MVVM - PullRequest
2 голосов
/ 20 октября 2011

Я пытаюсь работать с сеткой данных, используя шаблон MVVM.Проблема заключается в том, что всякий раз, когда я изменяю свойство VM, которое привязано к SelectedItem, на null, представление не отменяет выбор текущего выбранного элемента.Это моя привязка в xaml:

<DataGrid Grid.Column="0" Grid.Row="0" 
    ItemsSource="{Binding Path=Users}" 
    AutoGenerateColumns="False" 
    CanUserAddRows="False" 
    IsReadOnly="True" 
    SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay}">

Привязка SelectedItem работает от представления к виртуальной машине, поэтому в свойстве SelectedUser у меня всегда есть выбранный объект.Проблема в том, что в виртуальной машине я делаю некоторые вещи, которые иногда изменяют свойство SelectedUser на null, поэтому я ожидаю, что сетка данных также отменит выбор строки.Вместо этого он остается выбранным, и если я пытаюсь щелкнуть по той же строке, свойство не обновляется.Если щелкнуть любую другую строку, свойство изменится, как и ожидалось.

Есть ли способ отменить выбор сетки данных, если для свойства binded установлено значение null?Также я ищу решение MVVM, так как не хочу писать код позади.Я могу решить эту проблему, написав код, поэтому не тратьте время на то, чтобы предлагать такие решения:)

le: это моя собственность в ВМ:

public RPLUser SelectedUser
        {
            get
            {                
                return selectedUser;
            }
            set
            {
                selectedUser = value;
                OnPropertyChanged("SelectedUser");
            }
        }

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 20 октября 2011

Я рекомендую проверить Output Window в visual studio и посмотреть, не работает ли какой-либо Binding.

Вы уверены, что при выборе чего-либо выбор обновляется до свойства SelectedUser?

Вы установили точку останова в установщике SelectedUser и видите, что она срабатывает, когда вы выбираете что-то в таблице данных?

Причин для этого Binding может быть много ...

  1. SelectedUser отличается от индивидуального Users.
  2. SelectedUser не соответствует по ссылке ни с какими элементами в Users.
  3. Как и где вы устанавливаете ноль?

Следующий код в моем случае прекрасно работает ...

    <tk:DataGrid MaxHeight="200" AutoGenerateColumns="False"
                 ItemsSource="{Binding}"
                 SelectedItem="{Binding MySelItem,
                                        ElementName=MyDGSampleWindow,
                                        Mode=TwoWay}"
                 IsReadOnly="True">
        <tk:DataGrid.Columns>
            <tk:DataGridTextColumn Header="Key"
                                   Binding="{Binding Key,
                                                     Mode=OneWay}"/>
            <tk:DataGridTextColumn Header="Value"
                                   Binding="{Binding Value,
                                                     Mode=OneWay}"/>
        </tk:DataGrid.Columns>
    </tk:DataGrid>

Когда я устанавливаю MyDGSampleWindow.MySelItem как ноль, сетка данных правильно отменяет выбор. Возможно, вам, возможно, понадобится дать нам больше информации о том, как вы на самом деле устанавливаете значение как ноль.

4 голосов
/ 20 октября 2011

Вы пытались установить IsSynchronizedWithCurrentItem="True" в свойствах xaml для DataGrid? AFAIK, это позволит вам отменить выбор, установив для SelectedUser значение null.
Я не могу проверить это в данный момент, но вы также можете попробовать добавить это в установщик вашей собственности:

set
{
    selectedUser = value;
    OnPropertyChanged("SelectedUser");

    ICollectionView collectionView = CollectionViewSource.GetDefaultView(Users);
    collectionView.MoveCurrentTo(selectedUser);

}

(чтобы ICollectionView мог что-то сделать, вам нужно установить IsSynchronizedWithCurrentItem)
Как я уже сказал, я не могу проверить это прямо сейчас. Кроме того, установщик свойства, вероятно, не лучшее место для его размещения. Возможно, создайте обработчик события для события PropertyChanged локально и поместите эту логику туда.

Дайте мне знать, если это поможет, иначе я посмотрю, смогу ли я провести короткий тест ...

2 голосов
/ 20 октября 2011

Да, возможно, потребуется добавить XAML UpdateSourceTrigger для обновления пользовательского интерфейса.

SelectedItem="{Binding SomeProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
0 голосов
/ 20 октября 2011

DataGrid не отменяет выбор автоматически, поскольку для DataGridRow свойство IsSelected должно быть установлено на False.

Вы можете сделать это, установив стиль в DataGrid .. как

    <Style x:Key="dataGridRowStyle"
           BasedOn="{StaticResource {x:Type WPFToolkit:DataGridRow}}"
           TargetType="{x:Type WPFToolkit:DataGridRow}">
        <Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />
    </Style>  

Свойство IsSelected должно быть объектом, т.е. в вашем случае RPLUser должно иметь свойство Isselected

Затем, прежде чем установить SelectedUser на ноль ... просто сделайте SelectedUser.IsSelected=False

И не забудьте присоединить этот стиль к DataGridRowStyle в Datagrid

Я использую WPFToolkit, вы можете изменить стиль, если вы нацеливаетесь .NET 4.0

...