2010-05-18 5 views

답변

14

...

<ComboBox 
    ItemsSource="{Binding Path=AllItems}" 
    SelectedItem={Binding Path=CurrentItem, Mode=TwoWay} /> 
<TextBlock Text="{Binding Path=CurrentItem, Mode=TwoWay}" /> 

class public ItemListViewModel 
{ 
    public ObservableCollection<Item> AllItems {get; set;} 

    private Item _currentItem; 
    public Item CurrentItem 
    { 
     get { return _currentItem; } 
     set 
     { 
      if (_currentItem == value) return; 
      _currentItem = value; 
      RaisePropertyChanged("CurrentItem"); 
     } 
    } 
} 
+1

이것은 이상합니다. 나는 내가 어떤 블로그에 대해 읽어 때문에 이전에 제안 정확히 한 맹세 할 수 ... 지금 나는 다시 시도하고 일했다 : P 을 누군가가 관심 XD 이다이 경우에 도움이 한편 // UI 컨트롤 에서 선택된 색인으로 새로 만든 Schoolclass를 설정하십시오. SelectedSchoolclassIndex = (Schoolclasses.Count! = 0)? Schoolclasses.Count - 1 : 0; – msfanboy

+1

이 문제가 발생했습니다. 나는 2 개의 개별 콜렉션을 가지고 있고, equals 오퍼레이터를 잊어 버렸기 때문에 currentitem은 내가 XAML에서 바인드 한 콜렉션보다 다른 콜렉션에서 선택되었다. 따라서 equals를 구현하면 문제가 해결됩니다. 그러나 동일한 컬렉션에서 선택하면 문제도 해결됩니다. –

5

코드를 보지 않고 ComboBox에서 SelectedItem에 데이터를 바인딩 할 수없는 이유가 확실하지 않습니다. 아래는 현재 항목 관리가 내장 된 CollectionView를 사용하여 콤보 박스를 지원하는 방법을 보여줍니다. CollectionView는 현재 선택된 항목을 가져 오는 데 사용할 수있는 CurrentItem get 속성을 가지고 있습니다.

XAML :

<Window x:Class="CBTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <ComboBox 
      ItemsSource="{Binding Path=Names}" 
      IsSynchronizedWithCurrentItem="True"> 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding}" /> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 
     <TextBlock Text="{Binding Path=Names.CurrentItem}" /> 
    </StackPanel> 
</Window> 

코드 숨김

콤보 상자를 바인딩에 대한 우리의 성공적인 접근 방식은 다음과 같다
using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Data; 

namespace CBTest 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      DataContext = new VM(); 
     } 
    } 

    public class VM 
    { 
     public VM() 
     { 
      _namesModel.Add("Bob"); 
      _namesModel.Add("Joe"); 
      _namesModel.Add("Sally"); 
      _namesModel.Add("Lucy"); 

      Names = new CollectionView(_namesModel); 

      // Set currently selected item to Sally. 

      Names.MoveCurrentTo("Sally"); 
     } 

     public CollectionView Names { get; private set; } 

     private List<string> _namesModel = new List<string>(); 
    } 
} 
+0

"... 이유를 확실하지 코드를 보지 않고 ComboBox의 SelectedItem에 데이터를 바인딩 할 수 없습니다 .... " do a 쉬운 구글은 매우 넓은 확산 문제. CollectionView는 내 경우에 총 오버 헤드입니다. 게다가 ObservableCollection 을 CollectionView에없는 add/del에 사용할 수 있습니다. – msfanboy

+0

CollectionView는 ObservableCollection의 뷰일 수 있으므로 아무것도 걷어차기를해야합니다. CollectionView가 총 오버 헤드라는 것은 무엇을 의미합니까? CollectionView가 Current와 같이 필터링, 그룹화 및 정렬과 같은 다른 기능을 제공합니까? 나는 아직도 combobox에 selecteditem을 바인딩하는 문제가 무엇인지 모르겠다. –

+0

CollectionView thats ;-)가 필요하지 않습니다. 컨트롤의 작업을 정렬하려면 내 경우 DataGrid에이 기능이 있습니다. CollectionView는 열 헤더를 클릭하여 정렬하지 않는 listview에 적합합니다. – msfanboy

관련 문제