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
绑定到上面的ViewModel
和DataGrid
:
<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
的按钮,当启用编辑时,我点击编辑。
答案 0 :(得分:0)
https://social.msdn.microsoft.com/Forums/en-US/023a21fe-5176-4271-ac0a-3dd72dd77535/datagrid-make-the-only-row-editable-whose-edit-button-is-clicked-and-other-rows-should-not-be?forum=wpf这对我很有帮助 单击编辑按钮时,我使datagrid readonly = false on selectedItemchanged检查如果更新对于所选行是可见的,如果是,那么我使datagrid readonly = false else datagrid readonly = true 这使我可以在单击编辑按钮时编辑单行