2013-06-09 3 views
1

Combobox과 두 개의 버튼이 내 UserControl에 있습니다. XAML에서 Combobox의 선택된 색인을 직접 변경하도록 단추를 설정할 수 있습니까?XAML에서 콤보 상자 선택 변경

나는 두 가지 방법으로이 작업을 수행 한 :

숨김 코드

private void nextBut_Click(object sender, RoutedEventArgs e) 
     { 
      combo.SelectedIndex++; 
     } 

     private void prevBut_Click(object sender, RoutedEventArgs e) 
     { 

      combo.SelectedIndex--; 
     } 

또는 그 버튼에 명령을 바인딩 내 ModelView에 그 명령을 정의하여

.

XAML에 대한 또 다른 질문이 있습니다. 다른 질문을하거나이 기회에 이미 나를 읽는다면 정말 몰라요!

나는 UserControl을 보유하는 ItemsControl이지만, 더 많이 만들거나 삭제할 수 있기 때문에 여러개 또는 아무 것도 없을 수도 있습니다. 내 바깥 쪽이 활성화되어 있는지 또는 내 ItemsContol에 요소가 있는지 여부에 따라 다릅니다 (사용하지 않을 경우 사용하지 않도록 설정). 나는 이것이 Command Validation으로 할 수 있다고 생각하지만, 나는이 세상에서 새로운 사람인 것처럼 나에게 어려워 보인다. 이것은 또한 codebehind로 할 수 있지만 그것을 피하고 싶습니다. (Checkbox에 바인드 된 bool 속성을 정의하는 것과 같습니다. if(myItems.Count==0)

답변

2

나는 오히려 SelectedItem 속성을 ViewModel의 일부 속성에 바인딩하고이 단추를 ViewModel의 일부 명령에 바인딩합니다. 이 방법으로 ViewModel에서 상태 데이터 (selectedItem)를 유지하고이를 사용하여 추가 로직을 수행 할 수 있으므로 코드가 필요하지 않습니다.

CheckBox의 경우, ViewModel에 bool 속성을 추가하고 항목을 추가/제거 할 때마다이를 알립니다.

public bool HasItems {get {return Items.Any(); } } 

public void AddItem() 
{ 
    //...Add Items 
    NotifyPropertyChanged("HasItems"); 
} 

public void RemoveItem() 
{ 
    //...Remove Item 
    NotifyPropertyChanged("HasItems"); 
} 

이렇게하면 추가 변환기가 필요하지 않습니다.

+0

우아한. 영리한. 멋지게 잉태! –

2

체크 박스 문제는 수량을 bool로 변환하는 일반적인 문제입니다. 표준 WPF 응답은 체크 박스 IsChecked 속성을 바인딩합니다. IValueConverter를 통해 수집 및 경로를합니다. 여기에 그냥 할 수있는 변환기입니다 ...

public class QuantityToBoolConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
        System.Globalization.CultureInfo culture) 
    { 
     try 
     { 
      IEnumerable items = value as IEnumerable; 
      if (items != null) 
      { 
       return items.OfType<object>().Any(); 
      } 
     } 
     catch 
     { 
      return value; 
     } 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, 
         System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

이 ... 당신이 리소스로 XAML에서 선언해야합니다,를 배포하려면

<Window.Resources> 
    <converters:QuantityToBoolConverter x:Key="QuantityToBoolConverter"/> 
</Window.Resources> 

다음 항목에의 IsChecked 속성을 바인딩하고 컨버터를 선언 ... 콤보 상자의 selectedIndex의 문제에 대한

<ListBox Name="mylb"> 
</ListBox> 
<CheckBox IsChecked="{Binding ElementName=mylb, Path=ItemsSource, Converter={StaticResource 
        QuantityToBoolConverter}}"></CheckBox> 

, 당신은 CollectionViewSource의 문서를 확인할 수 있습니다. Here ViewModel에서 이것을 조작하여 현재 선택 항목을 이동할 수 있습니다. 검사 할 샘플 코드가 많이 있습니다. ICollectionView를 알면 WPF 개발자로서 잘 서비스 할 수 있습니다.

+1

+1. 비록 내가 물건을 간단하게 유지하는 것을 선호하지만. Additionaly, 나는'MarkupExtension'에서 모든 변환기를 상속 받기 때문에 자원으로 인스턴스화 할 필요가 없습니다. –

+0

MarkupExtension에서 상속 한 매우 가치있는 팁입니다. 와우! 그게 내 변환기 라이브러리를 바꾸는 소리 야! –