在我的程序中,我有一个UserControl,其中包含一个DataGrid
,ItemsSource
绑定到ObservableCollection
。对于DataGrid
,我需要能够禁用特定单元格并将其灰显。我想在c ++中最好这样做,因为我可能需要在运行时更改这些单元格。我知道如何使用IsReadOnly
,但看起来我只能为整个列切换。这成为一个问题,因为我的列绑定到数据,这使我更难以定位特定的网格单元格。
话虽如此,
XAML:
<DataGrid ItemsSource="{Binding Model.Collection}" ... >
<DataGrid.Columns>
<!-- Row Number -->
<DataGridTextColumn Width="SizeToCells" IsReadOnly="True" Binding="{Binding rowNum}" />
<!-- Inputs -->
<DataGridTextColumn Width="SizeToCells" IsReadOnly="False" Header="Inputs" Binding="{Binding input}" />
<!-- Outputs -->
<DataGridTextColumn Width="SizeToCells" IsReadOnly="False" Header="Outputs" Binding="{Binding output}" />
</DataGrid.Columns>
</DataGrid>
数据模型:
namespace Program.Data_Models
{
public class CartIO_Model : PropertyChangedBase
{
private string test1 = "One";
private string test2 = "Two";
private string test3 = "Three";
private string DISABLEDtest4 = "Four";
private string DISABLEDtest5 = "Five";
private ObservableCollection<collectionData> _collection;
public CartIO_Model()
{
Collection = new ObservableCollection<collectionData>();
Collection.Add(new collectionData() { rowNum = 0, input = test1, output = ""});
Collection.Add(new collectionData() { rowNum = 1, input = test2, output = ""});
Collection.Add(new collectionData() { rowNum = 2, input = "", output = test3 });
Collection.Add(new collectionData() { rowNum = 3, input = "", output = DISABLEDtest4 });
Collection.Add(new collectionData() { rowNum = 4, input = DISABLEDtest5, output = ""});
}
public ObservableCollection<collectionData> Collection
{...}
}
public class collectionData
{
public int rowNum { set; get; }
public string input { set; get; }
public string output { set; get; }
}
}
我在哪里以及如何控制启用/禁用哪些单元格?这让我感到困惑,因为IsEnabled
是View控件的特征,而不是ObservableCollection
的特征。
答案 0 :(得分:3)
您可以为列定义CellStyle
,并根据模型或视图模型中的任何数据启用/禁用单元格。这里我已禁用Inputs列中的所有单元格,其输入值为Test4
<DataGrid ItemsSource="{Binding Model.Collection}" >
<DataGrid.Columns>
<!-- Row Number -->
<DataGridTextColumn Width="SizeToCells" Binding="{Binding rowNum}">
</DataGridTextColumn>
<!-- Inputs -->
<DataGridTextColumn Width="SizeToCells" Header="Inputs" Binding="{Binding input}" >
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<DataTrigger Binding="{Binding input}" Value="Four">
<Setter Property="IsEnabled" Value="false"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<!-- Outputs -->
<DataGridTextColumn Width="SizeToCells" IsReadOnly="False" Header="Outputs" Binding="{Binding output}" />
</DataGrid.Columns>
</DataGrid>
答案 1 :(得分:0)
只需创建一个TextBox样式。
<Style x:Key="PoBodyTextBoxEditableStyle" TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding Status, Converter={StaticResource PoStatusToEditableConverter}}"
Value="False">
<Setter Property="IsEnabled"
Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
并设置EditingElementStyle。
<DataGridTextColumn x:Name="MyTextColumn"
Binding="{Binding MyText}"
Header="MyHeader"
Width="Auto"
EditingElementStyle="{StaticResource MyTextBoxEditableStyle}" />