Reputation: 136
I have a dataGrid bound with a Collection. For two columns (A and B), the data are 1 or 0. Instead, I would like to display Yes or No in a comboBoxColumn and of course if 'yes' is selected 1 is saved and 0 for 'no'.
How can I do that?
<DataGrid x:Name="dataGrid" ItemsSource="{Binding Collection}" AutoGenerateColumns="False"
SelectedItem="{Binding Selected, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Header="id" Binding="{Binding idproduct, UpdateSourceTrigger=PropertyChanged}" Visibility="Hidden"/>
<DataGridTextColumn Header="Ref Supplier" Binding="{Binding refsup, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="Description" Binding="{Binding description, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridComboBoxColumn Header="Unit"
ItemsSource="{Binding Collection, Source={StaticResource unit}}"
DisplayMemberPath="unit1"
SelectedValueBinding="{Binding unit}"
SelectedValuePath="idunit"/>
<DataGridTextColumn Header="Price/MOQ" Binding="{Binding priceMOQ, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="A" Binding="{Binding A, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="B" Binding="{Binding B, UpdateSourceTrigger=PropertyChanged}"/>
</DataGrid.Columns>
</DataGrid>
public class ProductViewModel : ViewModelBase
{
public Context ctx = new Context();
private ObservableCollection<product> collection;
public ObservableCollection<product> Collection
{
get
{
if (collection == null)
{
Get();
}
return collection;
}
set
{
collection = value;
OnPropertyChanged("Collection");
}
}
#region "Command"
}
public partial class product
{
public int idproduct { get; set; }
public string refsup { get; set; }
public string description { get; set; }
public Nullable<int> unit { get; set; }
public sbyte larot { get; set; }
public sbyte lasand { get; set; }
public virtual foodSupplier foodSupplier { get; set; }
public virtual unit unit1 { get; set; }
}
I tried the two ways, but it doesn't work.
<Page.Resources>
<hlp:YesNoToBooleanConverter x:Key="YesNoToConverter" />
</Page.Resources>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding A}"
SelectedValue="{Binding A}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Name="TextBlock" Text="No" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding}" Value="1">
<Setter TargetName="TextBlock" Property="Text" Value="Yes" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding B}"
SelectedValue="{Binding B}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource YesNoToConverter}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
public class YesNoToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
byte inValue = System.Convert.ToByte(value);
string outValue = (inValue == 1) ? "Yes" : "No";
return outValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch (value.ToString().Trim().ToLower())
{
case "yes":
return 1;
case "no":
return 0;
default:
return 0;
}
}
}
Upvotes: 2
Views: 1716
Reputation: 2772
I can suggest you the next exact solution of this problem. Please check this out. 1. ComboBox XAML code:
<DataGridComboBoxColumn Header="ActivityStatus" SelectedItemBinding="{Binding IsActive, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGridComboBoxColumn.ItemsSource>
<x:Array Type="system:Boolean">
<system:Boolean>True</system:Boolean>
<system:Boolean>False</system:Boolean>
</x:Array>
</DataGridComboBoxColumn.ItemsSource>
</DataGridComboBoxColumn>
you ca see the whole solution on this stack overflow query link: How to Display and select items in a Datagrid ComboBox with WPF C#, using MVVM.
regards,
Upvotes: 4