首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGrid中的Wpf MVVM选择/取消选择项

DataGrid中的Wpf MVVM选择/取消选择项
EN

Stack Overflow用户
提问于 2018-03-06 09:31:50
回答 3查看 1.3K关注 0票数 0

我正在处理一个MVVM项目,我在其中一个视图中包含了这个代码:

代码语言:javascript
复制
<GroupBox   Header="Defaut"  BorderBrush="#FF4EA8DE" FontSize="16" Foreground="#FF436EFF"  >
                    <DataGrid Background="Transparent" FontSize="14" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True" AutoGenerateColumns="False" Style="{x:Null}" 
                              ItemsSource="{Binding ErrorList}">
                        <DataGrid.Columns>
                            <DataGridTextColumn Width="0.5*" Header="{DynamicResource Numéro Cordon}" Binding="{Binding BeadName}"></DataGridTextColumn>
                            <DataGridTextColumn Width="0.5*" Header="{DynamicResource Indice Image}" Binding="{Binding IndiceImage}"></DataGridTextColumn>
                            <DataGridTextColumn Width="0.5*" Header="{DynamicResource Défaut}" Binding="{Binding DispDefault}"></DataGridTextColumn>
                            <DataGridTemplateColumn Header="{DynamicResource Criticité}" Width="0.5*">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <Label Content="{Binding IsError, Converter={StaticResource IsErrorToCriticityLevel}, Mode=OneWay}"></Label>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                        </DataGrid.Columns>

                        <DataGrid.CellStyle>
                            <Style TargetType="DataGridCell">
                                <Setter Property="CmdB:CommandBehavior.Event" Value="MouseDown" />
                                <Setter Property="CmdB:CommandBehavior.Command" Value="{Binding DataContext.RobotErrorSelectionChangedCommand, 
                                                                                                RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type controls:MetroWindow}}}"/>
                                <Setter Property="CmdB:CommandBehavior.CommandParameter" Value="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
                                <Style.Triggers>
                                    <Trigger Property="IsSelected" Value="true">
                                        <Setter Property="BorderBrush" Value="#FF6593CF" />
                                        <Setter Property="Background" Value="#FF6593CF" />
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </DataGrid.CellStyle>

                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="SelectionChanged">
                                <i:InvokeCommandAction Command="{Binding RobotErrorSelectionChangedCommand}" CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </DataGrid>
                </GroupBox>

我想要做的是能够取消选择在这个列表中选择的项目,但是我无法找到如何访问它。

下面是与此列表相关的ViewModel中的代码:

代码语言:javascript
复制
ObservableCollection<Erreur> _ErrorList;
    public ObservableCollection<Erreur> ErrorList
    {
        get { return _ErrorList; }
        set { _ErrorList = value; RaisePropertyChanged("ErrorList");}
    }


private RelayCommand<Erreur> _RobotErrorSelectionChangedCommand;
    public RelayCommand<Erreur> RobotErrorSelectionChangedCommand
    {
        get
        {
            return _RobotErrorSelectionChangedCommand
                ?? (_RobotErrorSelectionChangedCommand = new RelayCommand<Erreur>(
                (Erreur err) =>
                {
                    if (err != null)
                    {
                        viewservice.OpenDialog(new ErreurImageViewModel(err), ServiceLocator.Current.GetInstance<MainViewModel>());

                    }     
                }));
        }
    }

谢谢你的帮助或建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-06 10:48:44

您可以将Datagrid中的SelectedItem属性绑定到VM中的一个属性,并且要清除当前的选择,只需将属性设置为:null。这样,您可以随时通过代码取消选择SelectedItem

您可以这样将其绑定到视图中:

代码语言:javascript
复制
<DataGrid ItemsSource="{Binding ErrorList}" SelectedItem="{Binding SelectedError}" ...>

然后在您的ViewModel中添加:

代码语言:javascript
复制
    private Erreur _selectedError = null;

    public Erreur SelectedError
    {
        get => _selectedError;
        set
        {
            if (_selectedError == value) return;
            _selectedError = value;
            RaisePropertyChanged(nameof(SelectedError));
        }
    }

无论何时,只要您想清除所选内容,您都可以这样做:

代码语言:javascript
复制
SelectedError = null;

如果您想从代码中选择一个特定的实例,您可以:

代码语言:javascript
复制
SelectedError = myInstanceOfError;
票数 4
EN

Stack Overflow用户

发布于 2018-03-06 10:54:08

SelectedError属性绑定到XAML中的SelectedItem属性。

XAML:

代码语言:javascript
复制
<DataGrid Background="Transparent" FontSize="14" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True" AutoGenerateColumns="False" Style="{x:Null}" ItemsSource="{Binding ErrorList}" SelectedItem="{Binding SelectedError}">

C#属性:

代码语言:javascript
复制
private Erreur _SelectedError;
public Erreur SelectedError
{
    get { return _SelectedError; }
    set {
            if(_SelectedError != value)
            {
                 _SelectedErrorList = value; 
                 RaisePropertyChanged("SelectedError");
            }
        }
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-08 08:38:15

谢谢,这两个答案都是正确的,只要稍作修改,我补充道:

代码语言:javascript
复制
SelectedItem="{Binding SelectedError}"  in the XAML code.

我不得不对这个部分进行注释,以使命令无法工作:

代码语言:javascript
复制
<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding RobotErrorSelectionChangedCommand}" CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

现在,SelectedError获得所选的Item.Thanx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49127482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档