0

分割が選択されている場合、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;
}

助けてくれてありがとう。

4

2 に答える 2

1

コンボボックスは「カテゴリ」と呼ばれるプロパティにバインドされています。このプロパティの他のコードは表示されません。カテゴリのpropertychangedイベントを呼び出した場合にのみ更新されます。「ProjectCategories」にバインドするつもりでしたか?

于 2012-07-03T23:57:33.650 に答える
0

@Leeが言ったように、あなたのxmalは というオブジェクトにバインドされていますが、ビューモデルではCategoriesProjectCategoriesカテゴリコンボボックスをに変更します

<ComboBox x:Name="Categories" ItemsSource="{Binding ProjectCategories}" DisplayMemberPath="Name" SelectedValuePath="CategoryId" />

PropertyChangedEventHandlerすでにセッターで発生しているため、propertychanged イベントを呼び出す必要はありません。

于 2012-07-04T02:22:33.457 に答える