2013-08-27 4 views
0

В моем DataGrid у меня есть текстовый столбец, у которого есть флажок в заголовке.WPF Bind DataGridTExtCol со своим заголовком cheeckbox

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

Я хочу, чтобы связать значение Checkbox с Textbox - Если флажок установлен, то только пользователь может ввести значение в текстовое поле. В моем коде позади меня:

public bool Value1Checked { get; set; } 

// In constructor 
Value1Checked = false; 

Теперь, я считаю, что приложение не должно позволять вводить текст в TextBox в строке, его значение IsEnabled обладает свойством Value1Cheched то есть ложное. Если пользователь не щелкнет флажок Value1, он не должен позволять пользователю его добавлять. Но приведенный выше код не влияет. Пользователь по-прежнему может вводить значение в текстовом блоке независимо от значения флажка.

Где я иду не так ???

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ Заголовок содержит флажок и текст «Значение1». И я хочу, чтобы пользователь включал/отключал, чтобы вводить значение, на основе флажка, нажатого на заголовок.

Любые рекомендации или помощь, пожалуйста.

Благодаря

ОБНОВЛЕНО 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». Все еще то, что происходит не так?

ответ

1

Это может быть то, что вы хотите. Флажок вверху, который включает в себя все строки столбца. К сожалению DatagridTextColumn «s IsReadOnly не может быть связан с, так что вы должны использовать 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> 
+0

Когда я перемещаю фокус из текстового поля, он выбрасывает «Invalid Operation Exception» «Требуется двусторонняя привязка Path или XPath. – Tvd

+0

Я добавил« Value1Changed »в SampleData, но затем в строках этого столбца я могу ввести только bool value & not int. ???? Я добавил код xml выше в «Обновленный код» – Tvd

+1

@Tvd 'Text =" {Binding Path = Value1Checked} "' для вашего 'TextBlock' должен быть' Text = "{Binding Path = value1} ' – Shoe

0

Как насчет связывания IsReadOnly свойства TextBox в 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> 
+0

О Я К сожалению. Эти изменения влияют на часть заголовка, а не на фактический TextBox в строке DataGrid. Для этого я пробовал то же самое в «", но это не имеет значения. – Tvd

Смежные вопросы