Запретить удаление строки DataGrid - PullRequest
8 голосов
/ 12 сентября 2011

Я хочу защитить некоторые строки DataGrid от удаления пользователем, хотя для свойства CanUserDeleteRows установлено значение true.

Есть ли возможность защитить некоторые строки, возможно, с помощью привязки данных или триггера?ItemsSource связан с ObservableCollection T.

Ответы [ 2 ]

13 голосов
/ 12 сентября 2011

Если у вас есть свойство в связанных объектах, которое можно использовать для определения возможности удаления текущей строки, например «IsDeleteEnabled», тогда вы можете связать свойство CanUserDeleteRows объекта DataGrid с SelectedItem.IsDeleteEnabled.

Например,

<DataGrid Name="dataGrid1" 
        CanUserDeleteRows="{Binding ElementName=dataGrid1, Path=SelectedItem.IsDeleteEnabled}" 
0 голосов
/ 12 сентября 2011

Никогда не делал этого с помощью DataGrid.Обычно, когда мне нужно управлять чем-то вроде этого, я использую ListBox и DataTemplate с Grid внутри, чтобы дать ему представление о Grid или ListView с GridView в шаблоне, потому что они оба дают вам больший контроль над взаимодействием.

Снимок в темноте, поскольку вы привязываетесь, вы можете использовать DataGridTemplateColumn.CellEditingTemplate и создать свою собственную кнопку / текст Delete, которая будет видимой или включенной на основе логики в вашем объекте привязки.Может быть, что-то вроде этого (я не проверял это, но это должно быть направление, в котором вы можете двигаться)?

<dg:DataGridTemplateColumn Header="Action">
    <dg:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Text Content="Delete" />
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellTemplate>

    <dg:DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ButtonEnabled="{Binding Path=IsDeleteEnabled, Mode=OneWay}" Content="Delete" Command="{Binding Path=DeleteMe}" />
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellEditingTemplate>
</dg:DataGridTemplateColumn>

Используя этот метод, поскольку команда привязана к отдельному объекту, вы, вероятно, имели бычтобы вызвать событие, которое обрабатывает ViewModel вашего экрана, чтобы удалить эту строку из ObservableCollection.

Опять же, не уверен, что это лучший способ, но это мой 10-минутный удар по нему.Поэтому, если это ужасно, пожалуйста, не голосуйте за меня слишком сильно.

...