2013-11-23 191 views
0

我有一個數據網格與2列一個是DataGridComboBox即'序列號'列和其他DataGridTextColumn即'數量'。DataGridComboBox列可能或不具有值。如果組合框有值,然後用戶可以從中選擇一個值,然後數量列變爲不可編輯(只讀)並將1設置爲默認數量,否則它將成爲可編輯單元格,因此用戶可以輸入任何數量。根據combobox中的值選擇,可編輯數量列和不可編輯數?wpf datagrid:使單元格可編輯和不可編輯

+0

請張貼一些代碼文本框,要知道你曾經嘗試過什麼。 –

回答

0

你可以嘗試一些這樣的事

<Grid> 
    <DataGrid ItemsSource="{Binding A}" AutoGenerateColumns="False" > 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="Choose" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding ListOfValues}" SelectedValue="{Binding Selected, UpdateSourceTrigger=PropertyChanged}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn Header="Value"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 

         <TextBox Text="{Binding Selected, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding ValueAvalible}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid 

在細胞Demplate截至目前我已經把唯一的文本框和約束ValueAvalible爲只讀屬性。您也可以同時擁有標籤和TextBox,並且可以將ValueAvalible綁定到標籤和TextBox的可見性。如果值可用,您可以隱藏顯示標籤的文本。如果沒有值是否有在下拉列表,你可以隱藏標籤顯示,這將給像下面

<StackPanel> 
    <Label Content="{Binding Selected}" Visibility="{Binding ValueAvalible, Converter={StaticResource ResourceKey=booleanToVisiblity}}"/> 
     <TextBox Text="{Binding Selected, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding ValueAvalible, Converter={StaticResource ResourceKey=invertedBooleanToVisiblity}}"/> 
</StackPanel> 

更好的用戶體驗,在您的視圖模型

class ViewModel 
{ 
    public ObservableCollection<Values> A 
    { 
     get; 
     set; 
    } 

    public ViewModel() 
    { 
     A = new ObservableCollection<Values>(); 
     Values vv = new Values(); 
     vv.ListOfValues = new ObservableCollection<string>(); 
     vv.ListOfValues.Add("1"); 
     vv.ListOfValues.Add("2"); 
     vv.Selected = vv.ListOfValues[0]; 
     vv.ValueAvalible = true; 
     A.Add(vv); 
     A.Add(new Values()); 
    } 
} 

public class Values : NotifiyPropertyChanged 
{ 
    public ObservableCollection<string> ListOfValues 
    { 
     get; 
     set; 
    } 
    private string selectedValue; 
    public string Selected 
    { 
     get 
     { 
      return selectedValue; 
     } 
     set 
     { 
      selectedValue = value; 
      Notify("Selected"); 
     } 
    } 

    public bool ValueAvalible 
    { 
     get; 
     set; 
    } 

} 

public class NotifiyPropertyChanged : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void Notify(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

}