Ich musste eine ComboBox an Enum-Werte binden und folgten mehrere Ideen aus so. Ich landete mit der einfachsten Lösung, die ich finden konnte und die sollte alle meine Bedürfnisse passen, außer es funktioniert nicht vollständig, aber es sollte ...ComboBox Bindung an SelectedValue funktioniert nicht
Heres, was ich mache: Ich brauche die ComboBox in einem DataGrid Zelle, so definiert ich eine Datagridtemplatecolumn für das
<DataGridTemplateColumn MinWidth="150" Header="Data-Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding SelectedDataType,Mode=TwoWay}" ItemsSource="{Binding DataTypeValues}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
In meinem Viewmodel besiedeln ich die enum
public IEnumerable<MyType> DataTypeValues
{
get
{
return Enum.GetValues(typeof(MyType)).Cast<MyType>().ToList<MyType>();
}
}
Werte und eine Eigenschaft haben, für den gewählten Wert
Die ComboBox ist wie erwartet mit meinen Enum-Werten gefüllt, aber wenn ich einen anderen Wert auswähle, wird der Setter des SelectedDataType nicht aufgerufen, was bedeutet, dass ich keine Informationen darüber habe, welches Element gerade ausgewählt ist. Ich habe auch versucht, eine SelectedItem-Bindung anstelle von SelectedValue zu verwenden, aber das funktioniert auch nicht.
Was fehlt mir hier?
edit: Typo
EDIT2: -------- -------- UPDATE
Jetzt habe ich eine Probe WPF-Anwendung, mein Problem zu reproduzieren. Benutzte nur die relevanten Code-Teile darin, und Theres das gleiche Problem. Heres die vollständigen Quellcode dieses Beispiel:
XAML-Datei:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication2"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid ItemsSource="{Binding Parameters}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedParameter, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTemplateColumn MinWidth="150" Header="Data-Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataTypeValues}" SelectedItem="{Binding SelectedType, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
Und die CS-Datei:
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var vm = new Viewmodel();
DataContext = vm;
}
}
class Viewmodel : ViewModelBase
{
public Viewmodel()
{
Parameters = new ObservableCollection<Parameter>();
Parameters.Add(new Parameter());
}
public ObservableCollection<Parameter> Parameters
{
get; private set;
}
public Parameter SelectedParameter { get; set; }
}
class Parameter : ViewModelBase
{
MyType _selectedType;
public MyType SelectedType
{
get { return _selectedType; }
set
{
_selectedType = value;
OnPropertyChanged();
}
}
public IEnumerable<MyType> DataTypeValues
{
get { return Enum.GetValues(typeof(MyType)).Cast<MyType>(); }
}
}
public enum MyType
{
INT,
DOUBLE,
REAL,
STRING
}
public class ViewModelBase : INotifyPropertyChanged
{
protected virtual void OnPropertyChanged(bool validateFields = true, [CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
Ich habe versucht, mehr Variationen, aber es scheint wie das Problem ist die Verwendung der ComboBox innerhalb des DataGrid. Der obige Viewmodel-Code funktioniert gut, wenn ich die ComboBox an einem anderen Teil meiner Anwendung verwende. Aber wenn ich die CellTemplate der DataGridColumn definiere und die ComboBox dort zusammen mit dem hinterlegten Code verwende, funktioniert die Bindung an den ausgewählten Wert nicht wie beschrieben .... irgendwelche Ideen? Irgendetwas stimmt nicht mit meinem XAML? – Milhouse
Überprüfen Sie jetzt. Ich habe die Antwort aktualisiert. Es funktioniert gut von meiner Seite. – ViVi