WPF 数据网格中的数据绑定不起作用
Data Binding in WPF Data Grid not working
如果有以下 wpf 数据网格:
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding BlocksToGenerateList}"
GridLinesVisibility="Vertical"
CanUserDeleteRows="True"
CanUserAddRows="False"
CanUserSortColumns="False">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="ToolTip" Value="{Binding ToolTip}"/>
<Setter Property="Background" Value="LightBlue" />
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Blue"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
<DataTrigger Binding="{Binding VisibleInGrid, Mode=TwoWay}" Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Typ" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Path=TypeString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Types}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Ort" Width="150">
<DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<ComboBox SelectedItem="{Binding Path=Location, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Locations}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="False" Width="244"/>
<DataGridTextColumn Header="Control Unit" Binding="{Binding ControllingControlUnit}" IsReadOnly="{Binding IsControlUnit}" Width="200"/>
<DataGridTextColumn Header="Fehlernummer" Binding="{Binding FaultValue}" IsReadOnly="False" Width="90"/>
<DataGridTextColumn Header="Meldungsnummer" Binding="{Binding MessageValue}" IsReadOnly="False" Width="110"/>
</DataGrid.Columns>
</DataGrid>
所有绑定都指向一个名为 GridBlock 的 class,而 BlocksToGenerateList 是一个类型为 Item 的 ObserverableCollection。
现在,每个绑定都按预期工作,除了这个:IsReadOnly="{Binding IsControlUnit}".
有人可以帮助我,或者解释可能是什么问题吗?谢谢!
编辑:Visual Studio
中绑定错误的截图
翻译成英语时出错:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement
编辑:关于视图模型的一些信息
private ObservableCollection<GridBlock> _BlocksToGenerateList;
public ObservableCollection<GridBlock> BlocksToGenerateList
{
get { return _BlocksToGenerateList; }
set
{
if (_BlocksToGenerateList == value)
{
return;
}
_BlocksToGenerateList = value;
RaisePropertyChanged("BlocksToGenerateList");
}
}
GridBlock 有一个名为 IsControlUnit
的布尔值 属性
private bool _IsControlUnit;
public bool IsControlUnit
{
get { return _IsControlUnit; }
set
{
if (_IsControlUnit == value)
{
return;
}
_IsControlUnit = value;
RaisePropertyChanged("IsControlUnit");
}
}
@lidqy 是对的。
如果我将 DataGridTextBoxColum 替换为以下 DataGridTemplateColumn,它的效果非常好。谢谢大家!
<DataGridTemplateColumn Header="Control Unit" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding ControllingControlUnit}" IsReadOnly="{Binding
IsControlUnit}" BorderThickness="0" Background="Transparent"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
属性 IsReadOnly 没有看到 IsControlUnit 字段。
您也可以使用模板进行编辑和阅读。
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>Control Unit</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ControllingControlUnit}" Width="200" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding ControllingControlUnit}" IsReadOnly="{Binding IsControlUnit, UpdateSourceTrigger=PropertyChanged}" Width="200" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
你也可以加上IsEnabled,那你就不能selecttext
如果有以下 wpf 数据网格:
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding BlocksToGenerateList}"
GridLinesVisibility="Vertical"
CanUserDeleteRows="True"
CanUserAddRows="False"
CanUserSortColumns="False">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="ToolTip" Value="{Binding ToolTip}"/>
<Setter Property="Background" Value="LightBlue" />
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Blue"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
<DataTrigger Binding="{Binding VisibleInGrid, Mode=TwoWay}" Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Typ" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Path=TypeString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Types}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Ort" Width="150">
<DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<ComboBox SelectedItem="{Binding Path=Location, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Locations}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="False" Width="244"/>
<DataGridTextColumn Header="Control Unit" Binding="{Binding ControllingControlUnit}" IsReadOnly="{Binding IsControlUnit}" Width="200"/>
<DataGridTextColumn Header="Fehlernummer" Binding="{Binding FaultValue}" IsReadOnly="False" Width="90"/>
<DataGridTextColumn Header="Meldungsnummer" Binding="{Binding MessageValue}" IsReadOnly="False" Width="110"/>
</DataGrid.Columns>
</DataGrid>
所有绑定都指向一个名为 GridBlock 的 class,而 BlocksToGenerateList 是一个类型为 Item 的 ObserverableCollection。 现在,每个绑定都按预期工作,除了这个:IsReadOnly="{Binding IsControlUnit}".
有人可以帮助我,或者解释可能是什么问题吗?谢谢!
编辑:Visual Studio
中绑定错误的截图翻译成英语时出错:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement
编辑:关于视图模型的一些信息
private ObservableCollection<GridBlock> _BlocksToGenerateList;
public ObservableCollection<GridBlock> BlocksToGenerateList
{
get { return _BlocksToGenerateList; }
set
{
if (_BlocksToGenerateList == value)
{
return;
}
_BlocksToGenerateList = value;
RaisePropertyChanged("BlocksToGenerateList");
}
}
GridBlock 有一个名为 IsControlUnit
的布尔值 属性 private bool _IsControlUnit;
public bool IsControlUnit
{
get { return _IsControlUnit; }
set
{
if (_IsControlUnit == value)
{
return;
}
_IsControlUnit = value;
RaisePropertyChanged("IsControlUnit");
}
}
@lidqy 是对的。
如果我将 DataGridTextBoxColum 替换为以下 DataGridTemplateColumn,它的效果非常好。谢谢大家!
<DataGridTemplateColumn Header="Control Unit" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding ControllingControlUnit}" IsReadOnly="{Binding
IsControlUnit}" BorderThickness="0" Background="Transparent"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
属性 IsReadOnly 没有看到 IsControlUnit 字段。
您也可以使用模板进行编辑和阅读。
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>Control Unit</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ControllingControlUnit}" Width="200" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding ControllingControlUnit}" IsReadOnly="{Binding IsControlUnit, UpdateSourceTrigger=PropertyChanged}" Width="200" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
你也可以加上IsEnabled,那你就不能selecttext