What I have:
I have a DataGridTemplateColumn
with a ComboBox
:
<DataTemplate x:Key="ValuesCellTemplate">
<TextBlock Text="{Binding Path=SelectedValue, Mode=OneWay}" />
</DataTemplate>
<DataTemplate x:Key="ValuesCellEditingTemplate">
<ComboBox
Name="ValuesComboBox"
DisplayMemberPath="DisplayText"
ItemsSource="{Binding Path=Value, Mode=OneWay}"
SelectedValue="{Binding Path=SelectedValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="DisplayText" />
</DataTemplate>
I am autogenerating the columns, so the AutoGeneratingColumn
event looks like this:
if (e.PropertyName == "First")
{
var templateColumn = new DataGridTemplateColumn
{
Header = e.PropertyName,
CellTemplate = (sender as FrameworkElement).FindResource("ValuesCellTemplate") as DataTemplate,
CellEditingTemplate = (sender as FrameworkElement).FindResource("ValuesCellEditingTemplate") as DataTemplate
};
e.Column = templateColumn;
}
When Values
(which is an ObservableCollection
) is null
I want the cell to be readonly, so it won't be able to enter CellEditing mode.
There are 2 options for the contents of this column:
- a simple integer -
SelectedValue
ObservableCollection<int>
-Values
When Values
has values inside, when double-clicking the cell (or the TextBlock
)(so to say - entering CellEditing mode), a ComboBox
should appear, otherwise not. That's basically it.
What I have tried:
I tried doing it this way:
<DataTemplate x:Key="ValuesCellTemplate">
<TextBlock Text="{Binding Path=SelectedValue, Mode=OneWay}" />
</DataTemplate>
<DataTemplate x:Key="ValuesCellEditingTemplate">
<ComboBox
Name="ValuesComboBox"
DisplayMemberPath="DisplayText"
IsEnabled="{Binding HasItems, RelativeSource={RelativeSource Self}}"
ItemsSource="{Binding Path=Value, Mode=OneWay}"
SelectedValue="{Binding Path=SelectedValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="DisplayText" />
</DataTemplate>
But when I double-click on it, the TextBox
turns into an empty readonly ComboBox
(enters CellEditing mode). I just want for it to take no action (be readonly)(ONLY when Values
is null
).
What is the proper way to do that?
For the record, I am using MVVM pattern.
CodePudding user response:
An easy way to prevent the DataGrid
from entering the edit mode when you double-click on the TextBox
would be to handle the PreviewMouseDown
event for the cell:
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
DataGridCell cell = (DataGridCell)sender;
e.Handled = cell.DataContext is YourClass dataObject && !dataObject.Value.Any();
}
...
var templateColumn = new DataGridTemplateColumn
{
Header = e.PropertyName,
CellTemplate = (sender as FrameworkElement).FindResource("ValuesCellTemplate") as DataTemplate,
CellEditingTemplate = (sender as FrameworkElement).FindResource("ValuesCellEditingTemplate") as DataTemplate,
CellStyle = (sender as FrameworkElement).FindResource("ReadOnlyCellStyle") as Style,
};
XAML:
<Style x:Key="ReadOnlyCellStyle" TargetType="DataGridCell">
<EventSetter Event="PreviewMouseDown" Handler="OnPreviewMouseDown" />
</Style>