ComboBoxを列挙型の値にバインドしてから、いくつかのアイデアに従う必要がありました。私は見つけることができる最も簡単な解決策に終わった。それは完全には機能していないことを除いては、私のすべてのニーズに合っているはずだが、それは...SelectedValueへのComboBoxのバインディングが機能しません
Heres何をしているのですか? DataGridセルので、私は私が列挙値
public IEnumerable<MyType> DataTypeValues
{
get
{
return Enum.GetValues(typeof(MyType)).Cast<MyType>().ToList<MyType>();
}
}
を取り込むと、選択した値
のためのプロパティを持っている私のViewModelにその<DataGridTemplateColumn MinWidth="150" Header="Data-Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding SelectedDataType,Mode=TwoWay}" ItemsSource="{Binding DataTypeValues}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
ためDataGridTemplateColumnを定義しました
MyType _selectedType;
public MyType SelectedDataType
{
get { return _selectedType; }
set
{
_selectedType = value;
OnPropertyChanged();
}
}
ComboBoxは私の予想通り列挙されていますが、別の値を選択すると、SelectedDataTypeのセッターが呼び出されないため、Itemが現在選択されていません。私はSelectedValueの代わりにSelectedItemバインディングを使用しようとしましたが、どちらも機能しません。
ここには何が欠けていますか?
編集:タイプミス
EDIT2: -------- -------- UPDATE
今、私は私の問題を再現するサンプルWPFアプリケーションを作成しました。関連するコード部分のみを使用し、同じ問題を解決します。相続人はその例の完全なソースコード:
XAMLファイル:
<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>
とは.csファイル:
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;
}
}
私はより多くのバリエーションを試しましたが、問題はDataGrid内のComboBoxの使用方法のようです。上記のビューモデルコードは、アプリケーション内の別の部分でComboBoxを使用するとうまく動作します。しかし、私がDataGridColumnのCellTemplateを定義し、そこに投稿されたコードと共にComboBoxを使用すると、選択された値へのバインディングは説明どおりに動作しません。私のXAMLに何か問題がありますか? – Milhouse
今すぐ確認してください。私は答えを更新しました。私の側からはうまくいきます。 – ViVi