繁体   English   中英

wpf如何为当前选定的行禁用datagrid中的特定单元格

[英]wpf how to Disable specific cells in datagrid for the row currently selected

public class Work : BindableBase
{
    public bool IsEditable { get; set; }
    public string Task { get; set;}
    public string Description { get; set; }
}

public class JobViewModel : BindableBase
{
    public ObservableCollection<Work> { get; set; }
}

UserControl绑定到下面的ViewModelDataGrid

<DataGrid
        x:Name="WorkGrid"
        Grid.ColumnSpan="5"
        Margin="0,5,0,0"
        AutoGenerateColumns="False"
        CanUserAddRows="False"
        ItemsSource="{Binding Source={StaticResource WorkCollectionViewSource} }"
        PreviewKeyDown="dataGrid_PreviewKeyDown"
        HeadersVisibility="Column"
        >


    <DataGrid.Columns>
        <DataGridTemplateColumn Width="1.1*" Header="Sample" HeaderStyle="{StaticResource gridHeaderStyle}">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Padding="4" Text="{Binding Sample.Name}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ComboBox
                            MaxHeight="40"
                            SelectedValue="{Binding Path=Sample.ID,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
                            SelectedValuePath="ID"
                            ItemsSource="{Binding DataContext.Projects,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
                            SelectedItem="{Binding Path=Sample, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
                            DisplayMemberPath="Name"
                            IsEnabled="{Binding Sample.ID, Converter={StaticResource IdleSampleDisabled}, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}">

                        <ComboBox.Resources>
                            <converters:ComboBoxItemEnabledDisabledConverter x:Key="comboBoxItemConverter"/>
                        </ComboBox.Resources>
                        <ComboBox.ItemContainerStyle>
                            <Style TargetType="ComboBoxItem">
                                <Setter Property="IsEnabled" Value="{Binding Converter= {StaticResource comboBoxItemConverter}, ConverterParameter=999}"/>
                            </Style>
                        </ComboBox.ItemContainerStyle>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Width="1.1*" Header="Task" HeaderStyle="{StaticResource gridHeaderStyle}" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock
                            VerticalAlignment="Center"
                            Padding="3,0,0,0"
                            Text="{Binding Task}"
                            TextWrapping="Wrap"
                            xml:space="preserve"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox
                            VerticalAlignment="Center"
                            Padding="3,0,0,0"
                            Text="{Binding Task, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
                            TextWrapping="Wrap"
                            xml:space="preserve"/>
                    </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>



        <DataGridTemplateColumn Width="3*" Header="Description" HeaderStyle="{StaticResource gridHeaderStyle}" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel MaxHeight="100" Orientation="Vertical" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible">
                        <TextBlock
                                HorizontalAlignment="Left"
                                VerticalAlignment="Center"
                                ScrollViewer.HorizontalScrollBarVisibility="Visible"
                                Text="{Binding Description}"
                                TextWrapping="Wrap"
                                xml:space="preserve"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ScrollViewer Height="auto" MaxHeight="100" ScrollViewer.CanContentScroll="True" VerticalScrollBarVisibility="Auto">
                        <TextBox
                                Width="520"
                                Height="auto"
                                HorizontalAlignment="Left"
                                VerticalAlignment="Center"
                                AcceptsReturn="True"
                                Text="{Binding Description, NotifyOnTargetUpdated=True,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                TextWrapping="Wrap"
                                xml:space="preserve"/>
                        </ScrollViewer>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>


        <DataGridTemplateColumn MinWidth="80" Header="From Time" HeaderStyle="{StaticResource gridHeaderStyle}" CanUserSort="True" SortMemberPath="FromTime" SortDirection="Ascending" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding FromTime, StringFormat=t}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn MinWidth="80" Header="To Time" HeaderStyle="{StaticResource gridHeaderStyle}" CanUserSort="True" SortMemberPath="ToTime" SortDirection="Descending" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding ToTime, StringFormat=t}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn MinWidth="100" Header="Duration" HeaderStyle="{StaticResource gridHeaderStyle}">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding TaskTime, FallbackValue=00:00, StringFormat=hh\\:mm}" TextWrapping="Wrap"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>



        <DataGridTemplateColumn MinWidth="90">
            <DataGridTemplateColumn.CellTemplate>

                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition>
                            </RowDefinition>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition>
                            </ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Button
                                x:Name="btnEdit"
                                Grid.Column="0"
                                Grid.Row="0"
                                VerticalAlignment="Center"
                                Command="{Binding DataContext.EditCommand, NotifyOnSourceUpdated=True, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
                                CommandParameter="{Binding SelectedItem, NotifyOnSourceUpdated=True, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, UpdateSourceTrigger=PropertyChanged}"
                                Visibility="{Binding IsEditVisible,Converter={StaticResource EditVisibiltyConverter }}">
                            <Button.IsEnabled>
                                <MultiBinding Converter="{StaticResource editEnabledConverter}">
                                    <Binding NotifyOnSourceUpdated="True" Path="Sample.ID" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                    <Binding NotifyOnSourceUpdated="True" Path="DataContext.IsPastEntryEnabled" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                    <Binding NotifyOnSourceUpdated="True" Path="DataContext.LastSalaryDate" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                    <Binding NotifyOnSourceUpdated="True" Path="DataContext.CurrentDate" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                </MultiBinding>
                            </Button.IsEnabled>
                            <Button.Content>
                                <MultiBinding Converter="{StaticResource ButtonContentConverter }">
                                    <Binding NotifyOnSourceUpdated="True" Path="Sample.ID" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                    <Binding NotifyOnSourceUpdated="True" Path="RequestedEdit" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                </MultiBinding>
                            </Button.Content>
                        </Button>
                        <Button
                                x:Name="btnUpdate"
                                Grid.Column="0"
                                Grid.Row="0"
                                VerticalAlignment="Center"
                                Command="{Binding DataContext.UpdateCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                                CommandParameter="{Binding SelectedItem, NotifyOnSourceUpdated=True, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, UpdateSourceTrigger=PropertyChanged}"
                                Content="Update"
                                Visibility="{Binding IsUpdateVisible, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Converter={StaticResource EditVisibiltyConverter }}">
                            <Button.IsEnabled>
                                <MultiBinding Converter="{StaticResource editEnabledConverter}">
                                    <Binding NotifyOnSourceUpdated="True" Path="Sample.ID" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                    <Binding NotifyOnSourceUpdated="True" Path="DataContext.IsPastEntryEnabled" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                    <Binding NotifyOnSourceUpdated="True" Path="DataContext.LastSalaryDate" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                    <Binding NotifyOnSourceUpdated="True" Path="DataContext.CurrentDate" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" UpdateSourceTrigger="PropertyChanged">
                                    </Binding>
                                </MultiBinding>
                            </Button.IsEnabled>
                        </Button>
                    </Grid>
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Project.ID }" Value="999">
                            <!--<Setter TargetName="btnEdit" Property="Button.Content" Value="Request Edit"></Setter>-->
                            <Setter TargetName="btnEdit" Property="Button.IsEnabled" Value="true">
                            </Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Project.ID}" Value="9999">
                            <Setter TargetName="btnEdit" Property="Button.IsEnabled" Value="true">
                            </Setter>
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn MinWidth="90">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition>
                            </RowDefinition>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition>
                            </ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Button
                                x:Name="btnDelete"
                                Grid.Column="0"
                                Grid.Row="0"
                                VerticalAlignment="Center"
                                Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                                CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                Content="Delete"
                                Visibility="{Binding IsEditVisible, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged,Converter={StaticResource EditVisibiltyConverter }}"/>
                        <Button
                                x:Name="btnCancel"
                                Grid.Column="0"
                                Grid.Row="0"
                                VerticalAlignment="Center"
                                Command="{Binding DataContext.CancelUpdateCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                                CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                Content="Cancel"
                                Visibility="{Binding IsUpdateVisible,  NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged,Converter={StaticResource EditVisibiltyConverter }}"/>
                    </Grid>
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Sample.ID}" Value="999">
                            <Setter TargetName="btnDelete" Property="Button.IsEnabled" Value="False">
                            </Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Sample.ID}" Value="9999">
                            <Setter TargetName="btnDelete" Property="Button.IsEnabled" Value="false">
                            </Setter>
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

    </DataGrid.Columns>
</DataGrid>

当启用编辑并单击“编辑”时,我想禁用当前行的单元格(上述DataGrid按钮除外)。

https://social.msdn.microsoft.com/Forums/zh-CN/023a21fe-5176-4271-ac0a-3dd72dd77535/datagrid-make-the-only-row-editable-whose-edit-button-is-clicked-和其他行应该不应该?forum = wpf这可以帮助我,当在selectedItemchanged上单击编辑按钮时,我将datagrid 设为 readonly = false,如果选中,则对选定行是否可见更新,然后将datagrid设为readonly = false,否则datagrid readonly = true这使我可以在单击“编辑”按钮时编辑单个行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM