2010-05-12 67 views
3

我有我的Silverlight應用程序,它將數據從視圖模型中拉入數據網格。該虛擬機通過Mef公開。我也有一個具有組合框的細節網格。該虛擬機還包含用於填充組合框值的數據。第一次加載時,一切正常,te組合框上的選定項目是正確的,我可以選擇其他值。但是,如果我排序我的主要數據網格(允許sort = true),那麼我發現組合框中選定值的綁定消失了。組合框仍填充了數據,但沒有選擇任何內容。綁定組合框中選定的值查看模型

有沒有人遇到過這個問題?我不確定如何解決這個問題。

謝謝

回答

0

你是如何收集數據的組合框?它是一個字符串列表還是特定對象列表?可能發生的是,排序是在其組合框或每行數據中創建另一組對象,並且所選項目不再與引用匹配。你能發佈一個代碼示例嗎?

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

所以comboboxes是IEnumerable各種實體的集合。事情是在排序時,父表,組合框會丟失它們的選定值,但組合框的數據保持不變。通過小提琴手,我可以看到沒有任何後續調用來獲取組合框的數據。

0

之前我曾經用過的SelectedValue的一個想法和問題是,當一個combox,datagrid等......經歷了類似的狀態變化;焦點丟失,重畫和其他一些他們將改變SelectedValue爲null。有可能,當您選擇一個值時,VM上的SelectedValue(綁定屬性)被設置。但是,當網格排序時,它還會通知VM將SelectedValue設置爲'null'。因此,排序後組合框設置爲默認值。

您可以嘗試的一種方法是在SelectedValue屬性set中設置一個斷點,並在Debug.Assert期間查看值的設置頻率。

0

不確定你的設置在這裏,但如果你的數據網格是一個調用列表和CurrentCall是選定的項目,你不能使用元素綁定?例如。

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

我假設網格的DataContext的必然IEnumerable<Call>(或東西)在VM上,所以我會說一種會導致一個新的集合(例如,如果你說的.sort或命令等等)。

這裏是工作示例的快速切割(使用列表框在這種情況下,不DataGrid中)

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

希望它能幫助。