2013-10-24 2 views
0

В моей программе у меня есть UserControl, который содержит DataGrid, у которого есть ItemsSource, связанный с ObservableCollection. Для этого DataGrid Мне нужно уметь отключать и серовывать определенные ячейки. Я хотел бы сделать это предпочтительно в C++, потому что мне может потребоваться изменить, какие ячейки это происходит во время выполнения. Я знаю, как использовать IsReadOnly, но кажется, что я могу только переключать это для целого столбца. Это становится проблемой, потому что мои столбцы привязаны к данным, что затрудняет мне нацеливание на определенные ячейки сетки.Как отключить ячейку в DataGrid при привязке к ObservableCollection

С этим сказанным,

XAML:

<DataGrid ItemsSource="{Binding Model.Collection}" ... > 
    <DataGrid.Columns> 
      <!-- Row Number --> 
      <DataGridTextColumn Width="SizeToCells" IsReadOnly="True" Binding="{Binding rowNum}" /> 
      <!-- Inputs --> 
      <DataGridTextColumn Width="SizeToCells" IsReadOnly="False" Header="Inputs" Binding="{Binding input}" /> 
      <!-- Outputs --> 
      <DataGridTextColumn Width="SizeToCells" IsReadOnly="False" Header="Outputs" Binding="{Binding output}" /> 
    </DataGrid.Columns> 
</DataGrid> 

Модель данных:

namespace Program.Data_Models 
{ 
    public class CartIO_Model : PropertyChangedBase 
    { 
     private string test1 = "One"; 
     private string test2 = "Two"; 
     private string test3 = "Three"; 
     private string DISABLEDtest4 = "Four"; 
     private string DISABLEDtest5 = "Five"; 

     private ObservableCollection<collectionData> _collection; 

     public CartIO_Model() 
     { 
      Collection = new ObservableCollection<collectionData>(); 
      Collection.Add(new collectionData() { rowNum = 0, input = test1, output = ""}); 
      Collection.Add(new collectionData() { rowNum = 1, input = test2, output = ""}); 
      Collection.Add(new collectionData() { rowNum = 2, input = "", output = test3 }); 
      Collection.Add(new collectionData() { rowNum = 3, input = "", output = DISABLEDtest4 }); 
      Collection.Add(new collectionData() { rowNum = 4, input = DISABLEDtest5, output = ""}); 

     } 

     public ObservableCollection<collectionData> Collection 
     {...} 
    } 

    public class collectionData 
    { 
     public int rowNum { set; get; } 
     public string input { set; get; } 
     public string output { set; get; } 
    } 
} 

Где и как бы я контролировать, какие клетки включен/выключен? Это меня смущает, потому что IsEnabled является признаком контроля вида, а не ObservableCollection.

+0

, на каком условии вы хотите, чтобы ваши ячейки были отключены .. в значении какого-либо свойства в классе collectionData? – Nitin

+0

На самом деле зависит от того, какой переключатель выбран в другой модели ViewModel->. Это то, где я буду выполнять эти операции над «DataGrid»? –

+0

извините, но я не понимаю, поэтому при выборе переключателя вы хотите отключить некоторые ячейки в datagrid .. но как вы решаете, какая из этих ячеек будет таковой. Wont, какая ячейка для отключения зависит от данных внутри них? – Nitin

ответ

3

Вы можете определить CellStyle для своей колонки и включить/отключить ячейки в зависимости от любых данных в модели или в режиме просмотра. Здесь я отключил все ячейки в столбце Входы которых имеет входное значение в качестве test4

<DataGrid ItemsSource="{Binding Model.Collection}" > 
     <DataGrid.Columns> 
      <!-- Row Number --> 
      <DataGridTextColumn Width="SizeToCells" Binding="{Binding rowNum}"> 

      </DataGridTextColumn> 
      <!-- Inputs --> 
      <DataGridTextColumn Width="SizeToCells" Header="Inputs" Binding="{Binding input}" > 
       <DataGridTextColumn.CellStyle> 
        <Style TargetType="DataGridCell"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding input}" Value="Four"> 
           <Setter Property="IsEnabled" Value="false"/> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </DataGridTextColumn.CellStyle> 
      </DataGridTextColumn> 
      <!-- Outputs --> 
      <DataGridTextColumn Width="SizeToCells" IsReadOnly="False" Header="Outputs" Binding="{Binding output}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
+0

Можете ли вы только сделайте это для целого столбца, или я могу настроить таргетинг на определенные ячейки (как я буду определять ячейки во время выполнения?)? –

+0

это отключит только те ячейки в столбце, которые имеют конкретное значение. Если вы привязаны к некоторому свойству в ViewModel, он может отключить весь столбец также – Nitin

+0

О, я вижу. С помощью этой стратегии, как я смогу контролировать состояние IsEnabled на основании местоположения ячейки. Например: независимо от того, что находится в строке 4, столбец 2, когда я выбираю «RadioButton» в другой части моей программы, эта ячейка отключается. –

0

Просто создать стиль TextBox.

<Style x:Key="PoBodyTextBoxEditableStyle" TargetType="TextBox"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Status, Converter={StaticResource PoStatusToEditableConverter}}" 
         Value="False"> 
       <Setter Property="IsEnabled" 
         Value="False" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

и установить EditingElementStyle.

<DataGridTextColumn x:Name="MyTextColumn" 
        Binding="{Binding MyText}" 
        Header="MyHeader" 
        Width="Auto" 
        EditingElementStyle="{StaticResource MyTextBoxEditableStyle}" /> 
Смежные вопросы