在组合框上绑定选定的值以查看模型

时间:2010-05-12 13:48:22

标签: silverlight data-binding mef mvvm-light

我有我的silverlight应用程序,它将数据从视图模型中提取到数据网格中。 vm通过Mef暴露。我还有一个具有组合框的细节网格。 vm还包含用于填充组合框值的数据。首次加载时,一切正常,te组合框中的选定项目是正确的,我可以选择其他值。但是,如果我对主数据网格进行排序(允许sort = true),那么我会在组合框消失中找到所选值的绑定。组合框仍然填充了数据,但没有选择任何内容。

之前有没有人遇到过这个问题?我不确定如何解决这个问题。

谢谢

5 个答案:

答案 0 :(得分:1)

Shaggy,我前几天注意到这一点,试图设置异步ComboBox加载。出于某种原因,ComboBox似乎只是放弃了绑定(但你已经知道了)。无论如何,我把这篇文章放在一起解决了其中的一些问题。如果有帮助,请告诉我。

http://blogs.msdn.com/kylemc/archive/2010/06/18/combobox-sample-for-ria-services.aspx

凯尔

答案 1 :(得分:0)

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

答案 2 :(得分:0)

组合框的代码如下

 <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");
            }
        }
    }

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

答案 3 :(得分:0)

我之前对SelectedValue的一个想法和问题是,当一个combox,datagrid等...经历状态变化之类的;失去焦点,重绘和其他一些他们会将SelectedValue更改为null。当您选择值时,可以设置VM上的SelectedValue(绑定属性)。但是,当Grid对其进行排序时,它还会告诉VM将SelectedValue设置为“null”。因此,在排序之后,组合框被设置为默认值。

您可以尝试的事情是,在其中一个SelectedValue属性'set'上设置一个断点,并在Debug.Assert期间查看该值的设置频率,如果该值为null。

答案 4 :(得分:0)

此处不确定您的设置,但如果您的数据网格是一个调用列表而且CurrentCall是所选项目,您是否可以使用元素绑定? E.g。

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

我假设网格的datacontext绑定到你的VM上的IEnumerable<Call>(或其他东西),所以我会说排序会产生一个新的集合(就像你说的那样.Sort或order等)。

这是一个工作示例的快速剪切(在这种情况下使用列表框而不是数据网格)

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

希望它有所帮助。