2013-06-09 4 views
1

У меня есть Combobox и две кнопки в моем UserControl. Можно ли установить эту кнопку для изменения выбранного индекса Combobox непосредственно в XAML?Изменение выбора Combobox в XAML

Я сделал это с помощью двух подходов:

Code-за

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

     private void prevBut_Click(object sender, RoutedEventArgs e) 
     { 

      combo.SelectedIndex--; 
     } 

или путем связывания команд этих кнопок и определить эту команду в моем ModelView.

У меня есть еще один вопрос о XAML, и я действительно не знаю, задайте другой вопрос или воспользуйтесь этой возможностью, что вы уже читаете меня! Я уверен, что это должно быть просто (по крайней мере, для гуру WPF здесь):

У меня есть ItemsControl, который содержит это UserControl, но может быть несколько или ничего (потому что вы можете создать больше или удалить). Я хочу, чтобы Checkbox снаружи, который включен или не зависит от наличия или отсутствия элементов в моем ItemsContol (отключите, если нет ничего). Я думаю, что это можно сделать с помощью Command Validation, но мне кажется сложным, поскольку я новичок в этом мире. Это также можно сделать с помощью codebehind, но я хотел бы избежать этого. (Как и определение свойств Его, связанные с этой Checkbox как написать что-то вроде if(myItems.Count==0)

ответ

2

Я предпочел бы привязать свойство SelectedItem к некоторому свойству в ViewModel и привязать эти кнопки к некоторым командам в ViewModel. Таким образом, сохраняйте данные состояния (selectedItem) в ViewModel и можете использовать это для выполнения любой дополнительной логики, требующей удаления кода.

Для CheckBox я предпочел бы добавить свойство bool в ViewModel и уведомлять об этом, когда вы добавляете/удаляете элементы.

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 свойства ваших товаров и объявить конвертер ...

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

Для выпуска выпадающего SelectedIndex, вы можете проверить CollectionViewSource документов. Here Вы можете манипулировать этим в ViewModel, чтобы переместить текущий выбор. И есть тонны кода для проверки. Знание ICollectionView послужит вам хорошим разработчиком WPF.

+1

+1. Хотя я предпочитаю держать вещи простыми. Кроме того, я бы предпочел наследовать все мои конвертеры из «MarkupExtension», тем самым устраняя необходимость создания экземпляров в качестве ресурсов. –

+0

Очень ценный совет по наследованию от MarkupExtension. Whoooosh! Это звук меня, чтобы изменить мою библиотеку конвертеров! –

Смежные вопросы