简体   繁体   中英

Data Binding in WPF Data Grid not working

if have the following wpf data grid:

        <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>

All the Bindings are to a class called GridBlock, and BlocksToGenerateList is a ObserverableCollection of Type Item. Now, every binding works as excpected, except this one: IsReadOnly="{Binding IsControlUnit}".

Can somebody help me, or explain what the issue could be? Thank you!

Edit: Screenshot of binding error in Visual Studio

Error translated to english: Cannot find governing FrameworkElement or FrameworkContentElement for target element

在此处输入图片说明

Edit: Some information about the view model

        private ObservableCollection<GridBlock> _BlocksToGenerateList;
        public ObservableCollection<GridBlock> BlocksToGenerateList
        {
            get { return _BlocksToGenerateList; }
            set
            {
                if (_BlocksToGenerateList == value)
                {
                    return;
                }
                _BlocksToGenerateList = value;

                RaisePropertyChanged("BlocksToGenerateList");
            }
        }

GridBlock has a bool property called IsControlUnit

        private bool _IsControlUnit;
        public bool IsControlUnit
        {
            get { return _IsControlUnit; }
            set
            {
                if (_IsControlUnit == value)
                {
                    return;
                }
                _IsControlUnit = value;

                RaisePropertyChanged("IsControlUnit");
            }
        }

@lidqy is right.

If i replace the DataGridTextBoxColum with the following DataGridTemplateColumn, it works like a charm. Thank all of you!

<DataGridTemplateColumn Header="Control Unit" Width="200">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Text="{Binding ControllingControlUnit}" IsReadOnly="{Binding 
            IsControlUnit}" BorderThickness="0" Background="Transparent"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Property IsReadOnly does not see the IsControlUnit field.

You can also use the template for editing and reading.

<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>

You can also add IsEnabled , then you cannot select text

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM