2012-05-22 67 views
3

我使用C#,WPF並嘗試使用MVVM。所以我有一個MyObjects的ObservableCollection。該列表呈現到DataGrid中,MyObject的一個屬性是每行中ComboBoxes中顯示的靜態項目列表。C#WPF組合框 - 允許項目每個列表只能選擇一次

現在我想在一排在這個組合框中選擇一個項目,如果它是在另一行之前選擇,最後選擇已被刪除默認值。我怎樣才能管理這個?我的MyObjectViewModel知道它自己的組合框的變化,但它怎麼能告訴MainViewModel(它保存着MyObjects的ObservableCollection)來將最後一個選擇的組合框項目從另一個MyObject對象中改變出來?

+0

你說這份清單是靜態的,對吧?所以你不應該只能刪除選定的項目,它會自動更新所有行? – McGarnagle

+0

我不希望它從列表中刪除;如果之前還有另一個與此項目一起選擇的ComboBox,則必須刪除此ComboBox選擇。 – iop

+0

爲什麼不使用所有項目「AllItems」的列表,一個用於所選項目「SeledtedItems」,第三個項目使用可用項目「AvailableItems」,後者是「AllItems」減去「SelectedItems」的計算。該列表是您綁定到ComboBoxes的ItemsSource的列表。 每當「SelectedItems」更改時,都會在「AvailableItems」上觸發NotifyPropertyChanged。 – SvenG

回答

1

最好的方法是改變你的綁定焦點ListCollectionViews因爲這將允許你管理光標下面是一個例子:

視圖模型

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Data; 

    namespace BindingSample 
    { 
     public class ViewModel 
     { 
      private string[] _items = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; 

      public ViewModel() 
      { 
       List1 = new ListCollectionView(_items); 
       List2 = new ListCollectionView(_items); 
       List3 = new ListCollectionView(_items); 

       List1.CurrentChanged += (sender, args) => SyncSelections(List1); 
       List2.CurrentChanged += (sender, args) => SyncSelections(List2); 
       List3.CurrentChanged += (sender, args) => SyncSelections(List3); 
      } 

      public ListCollectionView List1 { get; set; } 

      public ListCollectionView List2 { get; set; } 

      public ListCollectionView List3 { get; set; } 

      private void SyncSelections(ListCollectionView activeSelection) 
      { 
       foreach (ListCollectionView view in new[] { List1, List2, List3 }) 
       { 
        if (view != activeSelection && view.CurrentItem == activeSelection.CurrentItem) 
         view.MoveCurrentTo(null); 
       } 
      } 
     } 
    } 

查看

<Window x:Class="ContextMenuSample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel Orientation="Vertical"> 
     <ListBox ItemsSource="{Binding List1}" /> 
     <ListBox ItemsSource="{Binding List2}" /> 
     <ListBox ItemsSource="{Binding List3}" />   
    </StackPanel> 
</Window> 

這將使您只能選擇一個項目。目前它是硬編碼的,但對於其他列表可以很容易地變得更加靈活。

+0

感謝您的回答,但按照您的方式,我需要在每個對象中使用相同的列表。難道不可以用一個靜態列表(所有對象的一個​​列表)來做到這一點? – iop

+0

只有一個實際列表,如_items變量中所定義。 List1,List2和List3只是這個靜態數據源的視圖。 –

相關問題