分割が選択されている場合、ComboBoxカテゴリのバインドは更新されません。
部門が選択されると、ProjectCategoriesプロパティには2つの結果が入力されますが、ビューは更新されません。
ProjectCategoriesを参照としてProjectCategoriesGetByDivisionId()に送信すると、バインディングは更新されます。
モデルとデータクラスへの参照を渡したくありません。モデルとデータクラスを変更せずにバインディングを更新するにはどうすればよいですか?
これは、CategoriesComboBoxのバインディングの値を変更するDivisionsComboBoxです。
<ComboBox x:Name="Divisions" ItemsSource="{Binding Divisions}" DisplayMemberPath="Name" SelectedValuePath="DivisionId">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding DivisionChanged}" CommandParameter="{Binding ElementName=Divisions, Path=SelectedItem}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
更新されていないComboBox
<ComboBox x:Name="Categories" ItemsSource="{Binding Categories}" DisplayMemberPath="Name" SelectedValuePath="CategoryId" />
DivisionsSelectedChangedイベントが発生したときに発生するメソッド。
private void DivisionChanged(Division d)
{
ProjectCategories = ProjectCategory.GetByDivisionId(d.DivisionId);
}
ComboBoxがバインドしているViewModelプロパティ
public ObservableCollection<ProjectCategory> ProjectCategories
{
get { return projectCategories; }
set
{
projectCategories = value;
if (base.PropertyChangedHandler != null)
base.PropertyChangedHandler(this, new PropertyChangedEventArgs("ProjectCategories"));
}
}
と呼ばれるモデルメソッド
public static ObservableCollection<ProjectCategory> GetByDivisionId(int divisionId)
{
return ProjectData.ProjectCategoriesGetByDivisionId(divisionId);
}
残りは自明だと思います。
public static ObservableCollection<ProjectCategory> ProjectCategoriesGetByDivisionId(int divisionId)
{
ObservableCollection<ProjectCategory> projectCategory = new ObservableCollection<ProjectCategory>();
SqlConnection conn = null;
try
{
conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("TRK_ProjectCategory_GetByDivisionId", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@DivisionId", SqlDbType.Int).Value = divisionId;
conn.Open();
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read())
projectCategory.Add(ObjectConstructors.ProjectCategoryConstructor(sdr));
}
catch (Exception ex)
{
ErrorHandler.EmailLog("MineralsData", "public static ObservableCollection<ProjectCategory> ProjectCategoriesGetByDivisionId(int divisionId)", ex.ToString(), string.Empty);
throw ex;
}
finally
{
if (conn != null)
conn.Close();
conn = null;
}
return projectCategory;
}
public static ProjectCategory ProjectCategoryConstructor(SqlDataReader dr)
{
ProjectCategory ec = new ProjectCategory();
ec.CategoryId = dr["CategoryId"].SDR_GetInt();
ec.Name = dr["Name"].SDR_GetString();
ec.Description = dr["Description"].SDR_GetString();
ec.LastModified = dr["LastModified"].SDR_GetDateTime();
ec.ModifiedBy = dr["ModifiedBy"].SDR_GetString();
return ec;
}
助けてくれてありがとう。