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