2013-11-23 188 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)); 
     } 
    } 
} 

}