C# 组合框未更新

C# 组合框未更新,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,选择分区时,组合框类别上的绑定不会更新。 选择分区后,ProjectCategories属性将填充两个结果,但视图不会更新 如果将ProjectCategories作为引用发送到ProjectCategoriesGetByDivisionId(),则绑定不会更新 我不想传递对模型和数据类的引用。如何在不更改模型和数据类的情况下进行绑定更新 下面是更改类别组合框绑定值的分区组合框 <ComboBox x:Name="Divisions" ItemsSource="{Binding Divis

选择分区时,组合框类别上的绑定不会更新。
选择分区后,ProjectCategories属性将填充两个结果,但视图不会更新

如果将ProjectCategories作为引用发送到ProjectCategoriesGetByDivisionId(),则绑定不会更新

我不想传递对模型和数据类的引用。如何在不更改模型和数据类的情况下进行绑定更新

下面是更改类别组合框绑定值的分区组合框

<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>
组合框绑定到的ViewModel属性

public ObservableCollection<ProjectCategory> ProjectCategories
{
    get { return projectCategories; }
    set
    {
        projectCategories = value;

        if (base.PropertyChangedHandler != null)
            base.PropertyChangedHandler(this, new PropertyChangedEventArgs("ProjectCategories"));
    }
}
公共可观测集合项目类别
{
获取{return projectCategories;}
设置
{
项目类别=价值;
if(base.PropertyChangedHandler!=null)
base.PropertyChangedHandler(这是新的PropertyChangedEventArgs(“项目类别”);
}
}
调用

public static ObservableCollection<ProjectCategory> GetByDivisionId(int divisionId)
{
    return ProjectData.ProjectCategoriesGetByDivisionId(divisionId);
}
公共静态ObservableCollection GetByDivisionId(int divisionId)
{
返回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;
}
公共静态ObservableCollection项目分类GetByDivisionId(int divisionId)
{
ObservableCollection projectCategory=新的ObservableCollection();
SqlConnection-conn=null;
尝试
{
conn=新的SqlConnection(connectionString);
SqlCommand cmd=newsqlcommand(“TRK\u ProjectCategory\u GetByDivisionId”,conn);
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(“@DivisionId”,SqlDbType.Int).Value=DivisionId;
conn.Open();
SqlDataReader sdr=cmd.ExecuteReader();
while(sdr.Read())
添加(ObjectConstructors.ProjectCategoryConstructor(sdr));
}
捕获(例外情况除外)
{
ErrorHandler.EmailLog(“MineralsData”,“公共静态ObservableCollection项目分类GetByDivisionId(int divisionId)”,例如ToString(),string.Empty);
掷骰子;
}
最后
{
如果(conn!=null)
康涅狄格州关闭();
conn=null;
}
返回项目类别;
}
公共静态项目类别ProjectCategory构造函数(SqlDataReader dr)
{
ProjectCategory ec=新项目类别();
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();
返回ec;
}

谢谢你的帮助

您的组合框绑定到一个名为“categories”的属性。不显示此属性的任何其他代码。只有在为类别调用propertychanged事件时,它才会更新。您的意思是绑定到“ProjectCategories”吗?

正如@Lee所说,您的xmal绑定到一个名为
Categories
的对象,但在viewmodel中您有
ProjectCategories
,将Categories组合框更改为

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


您不需要调用propertychanged事件,因为您已经在setter中引发了
PropertyChangedEventHandler

谢谢,这似乎是问题所在,我已经研究了很长时间,但从未见过它。。。我明天测试一下,给你打分。
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;
}
<ComboBox x:Name="Categories" ItemsSource="{Binding ProjectCategories}" DisplayMemberPath="Name" SelectedValuePath="CategoryId" />