Silverlight 将组合框上的选定值绑定到视图模型

Silverlight 将组合框上的选定值绑定到视图模型,silverlight,data-binding,mef,mvvm-light,Silverlight,Data Binding,Mef,Mvvm Light,我有我的silverlight应用程序,它将数据从视图模型拉入datagrid。vm通过Mef公开。我还有一个包含组合框的详细信息网格。vm还包含用于填充组合框值的数据。第一次加载时,一切正常,te组合框上的选定项正确无误,我可以选择其他值。但是,如果我对主数据网格进行排序(allow sort=true),那么我会在组合框dissapear上找到所选值的绑定。组合框仍填充有数据,但未选择任何内容 以前有人遇到过这个问题吗?我不知道如何解决这个问题 谢谢您如何收集组合框的数据?它是字符串列表还是

我有我的silverlight应用程序,它将数据从视图模型拉入datagrid。vm通过Mef公开。我还有一个包含组合框的详细信息网格。vm还包含用于填充组合框值的数据。第一次加载时,一切正常,te组合框上的选定项正确无误,我可以选择其他值。但是,如果我对主数据网格进行排序(allow sort=true),那么我会在组合框dissapear上找到所选值的绑定。组合框仍填充有数据,但未选择任何内容

以前有人遇到过这个问题吗?我不知道如何解决这个问题


谢谢

您如何收集组合框的数据?它是字符串列表还是特定对象列表?可能发生的情况是,排序正在其组合框或每行数据中创建另一组对象,而所选项不再与引用匹配。您可以发布一个代码示例吗?

组合框的代码如下所示

 <TextBlock>Status</TextBlock>
        <ComboBox x:Name="CB_Status"   ItemsSource="{Binding Status}" SelectedValuePath="StatusId" SelectedValue="{Binding CurrentCall.StatusId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" ItemTemplate="{StaticResource StatusTemplate}" />
        <TextBlock>Priority</TextBlock>
        <ComboBox x:Name="CB_Priority"  ItemsSource="{Binding Priorities}" SelectedValuePath="PriorityId" SelectedValue="{Binding CurrentCall.PriorityId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" ItemTemplate="{StaticResource PriorityTemplate}"/>
        <TextBlock>Issue Type</TextBlock>
        <ComboBox x:Name="CB_IssueType" ItemsSource="{Binding IssueType}" SelectedValuePath="IssueTypeId" SelectedValue="{Binding CurrentCall.IssueTypeId, Mode=TwoWay,NotifyOnValidationError=True, ValidatesOnExceptions=True}" ItemTemplate="{StaticResource IssueTemplate}" />
状态
优先
发行类型
数据从VM中提取,并在开始时使用异步调用调用数据,变量填充如下:

   private IEnumerable<Priority> _priorities;

    public IEnumerable<Priority> Priorities
    {
        get { return _priorities; }
        set
        {
            if (value != _priorities)
            {
                _priorities = value;
                this.RaisePropertyChanged("Priorities");
            }
        }
    }
 private IEnumerable<Status> _status;

    public IEnumerable<Status> Status
    {
        get { return _status; }
        set
        {
            if (value != _status)
            {
                _status = value;
                this.RaisePropertyChanged("Status");
            }
        }
    }


    private IEnumerable<IssueType> _issueType;

    public IEnumerable<IssueType> IssueType
    {
        get { return _issueType; }
        set
        {
            if (value != _issueType)
            {
                _issueType = value;
                this.RaisePropertyChanged("IssueType");
            }
        }
    }
private IEnumerable\u优先级;
公共优先事项
{
获取{return\u priorities;}
设置
{
如果(值!=\u优先级)
{
_优先权=价值;
此项。提高产权变更(“优先级”);
}
}
}
私有IEnumerable_状态;
公共数字地位
{
获取{return\u status;}
设置
{
如果(值!=\u状态)
{
_状态=价值;
本.RaiseProperty变更(“状态”);
}
}
}
私有IEnumerable发行类型;
公共IEnumerable发行类型
{
获取{return\u issueType;}
设置
{
如果(值!=\u issueType)
{
_issueType=值;
本.RaisePropertyChanged(“发行类型”);
}
}
}

因此,组合框是各种实体的IEnumerable集合。排序时,父表、组合框将丢失其选定的值,但组合框的数据保持不变。通过fiddler,我可以看到没有任何后续调用来获取组合框的数据。

我以前对SelectedValue的一个想法和问题是,当组合框、数据网格等。。。经历像这样的状态变化;失去焦点、重绘和其他一些操作会将SelectedValue更改为null。选择值时,可能会设置VM上的SelectedValue(绑定属性)。但是,当网格排序时,它还告诉VM将SelectedValue设置为“null”。因此,在排序之后,组合框被设置为默认值


您可以尝试的一件事是在SelectedValue属性“set”之一设置断点,并查看在调试期间设置值的频率。如果值为null,则断言。

不确定此处的设置,但如果datagrid是调用列表,CurrentCall是所选项,则不能使用元素绑定吗?例如

<ComboBox x:Name="CB_Status"   
                      ItemsSource="{Binding Status}" 
                     SelectedItem="{ Path=SelectedItem.Status, Mode=TwoWay, ElementName=YOUR_DATAGRID}" 
                     ItemTemplate="{StaticResource StatusTemplate}" /> 

我假设网格的datacontext绑定到您的VM上的
IEnumerable
(或其他东西),所以我想说排序将导致新的集合(如您所说的.sort或order等)

下面是一个工作示例的快速剪辑(在本例中使用的是listbox而不是datagrid)



希望有帮助。

Shaggy,前几天我在尝试设置异步组合框加载时注意到了这一点。出于某种原因,组合框看起来只是删除了绑定(但您已经知道)。不管怎样,我把这篇文章放在一起讨论了其中的一些问题。如果有帮助,请告诉我

凯尔

<ComboBox 
   DisplayMemberPath="DisplayName"
   SelectedItem="{Binding Path=SelectedItem.Individual.IndividualNameTitle, 
                   Mode=TwoWay, ElementName=AccountList}"
   ItemsSource="{Binding Path=IndividualNameTitles}">
</ComboBox>