2016-06-17 7 views
0

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; 
} 
} 
+0

私はより多くのバリエーションを試しましたが、問題はDataGrid内のComboBoxの使用方法のようです。上記のビューモデルコードは、アプリケーション内の別の部分でComboBoxを使用するとうまく動作します。しかし、私がDataGridColumnのCellTemplateを定義し、そこに投稿されたコードと共にComboBoxを使用すると、選択された値へのバインディングは説明どおりに動作しません。私のXAMLに何か問題がありますか? – Milhouse

+0

今すぐ確認してください。私は答えを更新しました。私の側からはうまくいきます。 – ViVi

答えて

0

** EDIT:**

はい、今問題があります。バインドされてからコードが機能していませんSelectedValue

代わりにSelectedItemプロパティをバインドしてチェックしてください。それは動作するはずです。

<DataGridTemplateColumn MinWidth="150" Header="Data-Type"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox SelectedItem="{Binding SelectedDataType,Mode=TwoWay}" ItemsSource="{Binding DataTypeValues}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

ご意見ありがとうございます。私はそれを今でも試みましたが、それと同じ結果です。値をComboBoxに取得しますが、SelectedItemまたはSelectedValueへのバインディングは、その方法では機能しません。 -/ – Milhouse

+0

今すぐチェックしてください。私は答えを更新しました。私の側からはうまくいきます。 – ViVi

+0

これをチェックしました – ViVi

0

私はあなたがウィンドウviewmodel内の選択した項目をバインドしていると思います。コードの下で私のために働いた。

XAML:

<DataGrid Name="datagrid" ItemsSource="{Binding List,Mode=TwoWay}" > 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Status" Width="100"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox Height="22" 
            ItemsSource="{Binding DataContext.DataTypeValues,RelativeSource={RelativeSource AncestorType=Window, 
                         AncestorLevel=1}}" 
             SelectedItem="{Binding SelectedDataType,UpdateSourceTrigger=PropertyChanged}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate>    

       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

のViewModel:

private List<ListItems> list; 

     public List<ListItems> List 
     { 
      get { return list; } 
      set 
      { 
       list = value; 
       this.NotifyPropertyChanged("List"); 
      } 
     } 

     public IEnumerable<MyType> DataTypeValues 
     { 
      get 
      { 
       return Enum.GetValues(typeof(MyType)).Cast<MyType>().ToList<MyType>(); 
      } 
     } 

     public ViewModel() 
     { 
      List = new List<ListItems>(); 
      List.Add(new ListItems()); 
      List.Add(new ListItems()); 

     } 

グリッドアイテム:

public class ListItems 
    { 

     MyType _selectedType; 
     public MyType SelectedDataType 
     { 
      get { return _selectedType; } 
      set 
      { 
       _selectedType = value; 
       this.NotifyPropertyChanged("SelectedDataType"); 
      } 
     } 
    } 
0

のようにプロパティまたはのSelectedItemをSelectedValueのために結合しているときには、要素名を使用する必要があります
+0

それは理解していません...どのようにバインドする必要があります...私のコンボボックスのSelectedItemを親DataGrid SelectedItemにバインドする。私には意味がありません... – Milhouse

+0

ご迷惑をおかけしますが、それは親コンポーネントのデータコンテキストでコンポーネントをバインドすると私にとってはうまくいくが、子プロセスは自動的に親のデータコンテキストを継承する。 –

関連する問題