2008-11-06 4 views
2

ObservableCollection에 바인딩 된이 ListBox가 있습니다. 목록의 각 개체는 ISelectable이라는 인터페이스를 구현합니다.ListBox의 SelectedItem을 어떻게 동기화합니까?

public interface ISelectable : INotifyPropertyChanged 
{ 
    event EventHandler IsSelected; 
    bool Selected { get; set; } 
    string DisplayText { get; } 
} 

선택 방법에 관계없이 어떤 개체가 선택되었는지 추적하고 싶습니다. 사용자는 ListBox에서 객체의 표현을 클릭 할 수 있지만 코드를 통해 객체가 선택 될 수도 있습니다. 사용자가 ListBox를 통해 개체를 선택하면 선택한 항목을 ISelectable에 캐스팅하고 Selected 속성을 true로 설정합니다.

ISelectable selectable = (ISelectable)e.AddedItems[0]; 
selectable.Selected = true; 

내 문제는 코드를 사용하여 개체를 선택하면 ListBox에서 선택한 항목을 변경할 수 없다는 것입니다. 선택한 개체를 다른 색으로 표시하는 DataTemplate을 사용하여 모든 것이 올바르게 표시되는지 확인합니다. 그러나 ListBox에는 사용자가 SelectedItem으로 클릭 한 마지막 객체가 있습니다. 즉, 목록에서 다른 객체를 먼저 선택하지 않으면 해당 객체를 클릭 할 수 없습니다.

누구든지이 문제를 해결하는 방법에 대한 아이디어가 있습니까? Mouse 및 Keyboard 이벤트를 처리하기 위해 사용자 정의 코드를 작성하여 원하는 것을 성취 할 수 있다고 확신하지만 오히려 그렇지 않습니다. 컬렉션에 SelectedItem 속성을 추가하고 ListBox의 SelectItemProperty에 바인딩하려고했지만 행운이 없습니다.

답변

4

ListBoxItem.IsSelected를 Selected 속성에 바인딩하는 데이터로이 작업을 수행 할 수도 있습니다. 아이디어는 각 ListBoxItem이 생성 될 때 바인딩을 설정하는 것입니다. 이 작업은 ListBox에 대해 생성 된 각 ListBoxItem을 대상으로하는 스타일을 사용하여 수행 할 수 있습니다.

이렇게하면 ListBox의 항목을 선택하거나 선택 취소하면 해당 Selected 속성이 업데이트됩니다. 마찬가지로 코드에서 Selected 속성을 설정하면 ListBox에 반영됩니다.

이 작업을 수행하려면 Selected 속성이 PropertyChanged 이벤트를 발생시켜야합니다.

<List.Resources> 
    <Style TargetType="ListBoxItem"> 
     <Setter 
      Property="IsSelected" 
      Value="{Binding 
         Path=DataContext.Selected, 
         RelativeSource={RelativeSource Self}}" 
      /> 
    </Style> 
</List.Resources> 
+0

이것은 정확하게 내가 찾고 있었던 것이었다. 감사! –

1

목록 상자의 SelectedItemChanged 및 SelectedIndexChanged 이벤트를 보았습니까?

선택 사항이 변경되는 경우에도 선택 항목이 변경 될 때마다 트리거되어야합니다.

+0

ListBox에서 항목을 클릭해도 아무런 문제가 없습니다. 이 경우 SelectionChanged 이벤트를 사용하고 있습니다. 문제는 기본 목록에서 항목을 선택할 때 ListBox에서 선택 항목을 업데이트하도록하려는 것입니다. –

0

select가 변경되면 propertyChanged 이벤트를 발생시켜야한다고 생각합니다. 이 코드를 ISelectable을 구현하는 개체에 추가하십시오. 나는 folowing 코드를 시도했습니다

private bool _Selected; 
     public bool Selected 
     { 
      get 
      { 
       return _Selected; 
      } 
      set 
      { 
       if (PropertyChanged != null)     
        PropertyChanged(this, new PropertyChangedEventArgs("Selected")); 

       _Selected = value; 
      } 
     } 

: TestClass에이 ISelectable를 구현

public ObservableCollection<testClass> tests = new ObservableCollection<testClass>(); 

     public Window1() 
     { 
      InitializeComponent(); 
      tests.Add(new testClass("Row 1")); 
      tests.Add(new testClass("Row 2")); 
      tests.Add(new testClass("Row 3")); 
      tests.Add(new testClass("Row 4")); 
      tests.Add(new testClass("Row 5")); 
      tests.Add(new testClass("Row 6")); 
      TheList.ItemsSource = tests; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      tests[3].Selected = true; 
      TheList.SelectedItem = tests[3]; 
     } 

당신은 같은 것을하게 될 겁니다.

<ListBox Grid.Row="0" x:Name="TheList"></ListBox>   
<Button Grid.Row="1" Click="Button_Click">Select 4th</Button> 

난이 도움이되기를 바랍니다 :

는 XAML의 조각, 공상에 불과하다.