我有一个包含2列的数据网格,一个是DataGridComboBox,即'Serial No'列,另一个是DataGridTextColumn即'Qty'.DataGridComboBox列可能有或没有值。如果组合框有值,那么用户可以选择一个从它的值然后qty列变得不可编辑(只读)并将1设置为默认值,否则它变为可编辑单元格,因此用户可以在其上输入任何数量。如何根据值使数量列可编辑且不可编辑从组合框中选择?
答案 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
在目前的Cell Demplate中,我只将TextBox和ValueAvalible绑定到readonly Property。您还可以同时使用label和TextBox,并且可以将ValueAvalible绑定到label和TextBox的可见性。如果值可用,您可以隐藏文本显示标签。如果comboBox中没有值,您可以隐藏标签并显示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>
在你的viewModel
中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));
}
}
}
}