私の目標は、WPFで一連のカスケードコンボボックスを使用することです。私はMVVMモデルを使用しようとしていますが、まだ学習しています。MVVMを使用したDataGridのカスケードコンボボックス
プロジェクトの背景情報。私は従業員の時間を編集しようとしています。
私は、DataGridで選択した従業員のTimesのリストを持っています。 DataGridの各行はTimeオブジェクトです。時間は、InTime、OutTime、Date、Hours ...などのいくつかのフィールドで構成されます。時間にも部門と仕事があります。
現在、Department ComboBoxが有線で動作していますが、Departmentフィールドで選択した内容に基づいてJobコンボボックスを構築する方法がわかりません。ここで
は私のViewModelが選択されているどのように私は何に基づいて、そのアイテムを投入するために、私の仕事のコンボボックスを実装するのです
<DataGrid Grid.Row="1" Margin="15,0,15,15" Visibility="Visible" FontSize="14" HorizontalGridLinesBrush="{StaticResource Nelson2}" VerticalGridLinesBrush="{StaticResource Nelson2}" ItemsSource="{Binding Times}" SelectionMode="Single" CellEditEnding="DataGrid_CellEditEnding" RowEditEnding="DataGrid_RowEditEnding" AutoGenerateColumns="False">
<DataGridTemplateColumn Header="Department Code">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path= Department.Display}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource Findancestor, AncestorType={x:Type UserControl}}, Path=DataContext.Departments}" DisplayMemberPath="Display" SelectedValuePath="DepartmentCode" SelectedValue="{Binding Department.DepartmentCode}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid>
だから私のデータグリッドにバインドされ
public ObservableCollection<Time> Times { get; set; }
public ObservableCollection<Department> Departments { get; set; }
public TimeSheetsViewModel()
{
Times = new ObservableCollection<Time>();
Departments = new ObservableCollection<Departments>();
GetDepartments();
}
private void GetDepartments()
{
/*
This section contains code to connect to my SQL Database and fills a DataTable dt
*/
if (Departments != null)
Departments.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
Department d = new Department() { Display = dt.Rows[i]["DISPLAY"].ToString(), DepartmentCode = dt.Rows[i]["DEPARTMENT_CODE"].ToString(), CompanyCode = dt.Rows[i]["COMPANY_CODE"].ToString() };
Departments.Add(d);
}
}
この
に設定されている方法ですその列の部門のために?私はこのコードを同じビューモデルに入れたいと思っています。
ありがとうございました。
EDIT(04/05/16):私は、そのオブジェクトのフィールドに異なるものをバインドすることコンバーターを使用できるように
どのように変換して、オブジェクトを返すことができます。
これは私のコンバータ
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string departmentCode = values[0].ToString();
ObservableCollection<Department> Departments = values[1] as ObservableCollection<Department>;
return Departments.FirstOrDefault(Department => Department.DepartmentCode == departmentCode);
}
であり、これは私のバインディング
コンバータは部門オブジェクトを返します<TextBlock >
<TextBlock.Text>
<MultiBinding Converter="{StaticResource DeptCodeToDeptConverter}" >
<Binding Path="DepartmentCode" />
<Binding Path="DataContext.Departments" RelativeSource="{RelativeSource Findancestor, AncestorType={x:Type UserControl}}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
が、何であれば、私はTextBlockののテキストはDepartment.Nameになりたいかと言います位置。別のコントロールで使用したいフィールドのそれぞれを返すために新しいコンバータを作成する必要がありますか?または、私はこの方法を使って何をしたいのかを達成する方法がありますか?
ありがとう@ジョー、私はここで少し混乱しています。この物語ではかなり新しい。私のDataGridの各行は、それ自身のビューモデルのインスタンスにバインドする必要がありますか? –
申し訳ありませんが、各行にビューモデルがあるはずです。それは私がそれについて行く方法です。それが単純なデータ表であれば、それはそれを保証するとは思えませんが、そこにはもっと複雑な機能がはっきりとあります。あなたはおそらく行ビューモデルなしでもマルチバインディングコンバータを使用することができます。何行目を期待していますか? – Joe
これを実装した方法を見ると、マルチビューのバインディングはTimeビューのモデルを使用しなくてもうまく動作します。私は明日(9時間ほど)より詳細な例をノックアップします。どのコレクションのゴスを2番目のコンボボックスに定義しているのですか(最初の私が推測した部門コードを使用して) – Joe