【问题标题】:WPF Bind DataGridTExtCol with its header cheeckboxWPF 将 DataGridTExtCol 与其标题复选框绑定
【发布时间】:2013-08-30 08:39:33
【问题描述】:

在我的 DataGrid 中,我有一个文本列,它的标题中有一个复选框。

   <DataGridTextColumn Binding="{Binding Path=value1}" >
       <DataGridTextColumn.Header>                                       
            <Grid>
                <Grid.ColumnDefinitions>
                      <ColumnDefinition/>
                      <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="1" Text="Value1" IsEnabled="{Binding Value1Checked}" />
                <CheckBox Name="chkValue1" Grid.Column="0" Width="16" IsChecked="{Binding Path=Value1Checked, Mode=TwoWay}"  />
           </Grid>
      </DataGridTextColumn.Header>                                    
   </DataGridTextColumn>

我想将复选框值与文本框绑定 - 如果选中该复选框,则只有用户可以在文本框中输入值。 在我后面的代码中:

public bool Value1Checked { get; set; }

// In constructor
Value1Checked = false; 

现在,我认为应用程序不应允许在该行的 TExtBox 中输入文本,因为它的 IsEnabled 值具有属性 Value1Cheched,即 false。除非用户单击 Value1 复选框,否则不应让用户添加它。但是上面的代码没有影响。无论复选框的值如何,用户仍然可以在文本块中输入值。

我哪里错了??

附加信息 标题包含一个复选框和文本“Value1”。我想让用户根据点击标题的复选框启用/禁用输入值。

请提供任何指导或帮助。

谢谢

更新的 XML 代码

                        <DataGridTemplateColumn>
                            <DataGridTemplateColumn.Header>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Grid.Column="1" Text="TValue1" IsEnabled="{Binding ElementName=chkValue1, Path=IsChecked}" />
                                    <CheckBox Name="chkValue1" Grid.Column="0" Width="16" />
                                </Grid>
                            </DataGridTemplateColumn.Header>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Path=Value1Checked}" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                            <DataGridTemplateColumn.CellEditingTemplate>
                         <DataTemplate>
                             <TextBox IsEnabled="{Binding ElementName=chkValue1, Path=IsChecked}" Text="{Binding Path=value1, Mode=TwoWay}" />
                         </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
               </DataGridTemplateColumn>

           </DataGrid.Columns>
       </DataGrid>

有了这个,如果我选中复选框,那么只有我能够在该列中为每一行输入值。但是,默认情况下,每行的该列中的值是“FALSE”,当我输入文本时,我输入(int)“23”并且焦点丢失它再次仅显示“FALSE”。还是怎么了??

【问题讨论】:

    标签: c# wpf binding checkbox textbox


    【解决方案1】:

    这可能是你想要的。顶部的复选框,用于切换是否可以输入所有列的行。可惜DatagridTextColumnIsReadOnly不能绑定,所以只能用DataGridTemplateColumn,但最终结果是一样的

    <DataGridTemplateColumn>
        <DataGridTemplateColumn.Header>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="1" Text="Value1" IsEnabled="{Binding ElementName=chkValue1, Path=IsChecked}" />
                <CheckBox Name="chkValue1" Grid.Column="0" Width="16" />
            </Grid>
        </DataGridTemplateColumn.Header>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=myProperty}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox IsEnabled="{Binding ElementName=chkValue1, Path=IsChecked}" Text="{Binding Path=myProperty, Mode=TwoWay}" />
                </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>
    

    【讨论】:

    • 当我从文本框中移动焦点时,它会抛出“无效操作异常”“双向绑定需要路径或 XPath。
    • 我在 SampleData 中添加了“Value1Changed”,但是在该列的行中,我只能输入 bool 值而不是 int。 ???我在“更新代码”中添加了上面的xml代码
    • @Tvd Text="{Binding Path=Value1Checked}" 你的TextBlock 应该是Text="{Binding Path=value1}
    • 哦,吉姆,非常感谢。这终于奏效了。吉姆现在也帮助我行明智。对于上述相同的网格,我在第一个网格上有一个复选框 col,如果单击该复选框,则仅允许用户输入该行的其他 cols。我也需要那个选项。您提供的解决方案不起作用,所以。请也帮助我解决这一点。
    • @Tvd 您应该使用更新的解决方案打开一个新问题,并询问您在启用列之上启用行的新要求。
    【解决方案2】:

    如何将TextBoxIsReadOnly 属性绑定到Checkbox.IsChecked 属性?:

    <DataGridTextColumn Binding="{Binding Path=value1}" >
        <DataGridTextColumn.Header>                                       
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBox Grid.Column="1" Text="{Binding}" IsReadOnly="{Binding IsChecked, 
    ElementName=chkValue}" />
                <CheckBox Name="chkValue1"  Grid.Column="0" Width="16" IsChecked="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type DataGridColumn}}, Path=
    DataContext.AllItemsAreChecked}" />
            </Grid>
        </DataGridTextColumn.Header>                                    
    </DataGridTextColumn>
    

    【讨论】:

    • 对不起。此更改会影响标题部分,而不是 DataGrid 行中的实际 TextBox。为此,我在 "" 上尝试了相同的操作,但没有区别。
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2023-03-17
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多