2015-08-14 2 views
2

В первом столбце у меня есть список групп («Первый», «Второй»). Во втором столбце у меня 5 кнопок. Я хочу включить или отключить группу кнопок после выбора группы в первом столбце. Как это сделать в шаблоне MVVM?Группа кнопок включения WPF

enter image description here

enter image description here

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new Data(); 
    } 
} 
public class Data 
{ 
    public List<string> Items { get; set; } 
    public Data() 
    { 
     Items = new List<string>(); 
     Items.Add("First"); 
     Items.Add("Second"); 
    } 
} 

Xaml:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition></ColumnDefinition> 
     <ColumnDefinition></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <ListView ItemsSource="{Binding Items}" Grid.Column="0"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Label Content="{Binding .}"></Label> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    <Button Content="First" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="21,24,0,0" VerticalAlignment="Top" Width="76" IsEnabled="False"/> 
    <Button Content="Second" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="102,48,0,0" VerticalAlignment="Top" Width="76" IsEnabled="True"/> 
    <Button Content="First" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="33,83,0,0" VerticalAlignment="Top" Width="76" IsEnabled="False"/> 
    <Button Content="Second" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="126,93,0,0" VerticalAlignment="Top" Width="76" IsEnabled="True" RenderTransformOrigin="1.088,-0.075"/> 
    <Button Content="Second" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="93,186,0,0" VerticalAlignment="Top" Width="76" IsEnabled="True"/> 
</Grid> 
+0

Привязать к свойству 'IsEnabled' и использовать конвертер для проверки на включение или выключение на основе выбранного элемента. –

+0

http://stackoverflow.com/a/31885801/2470362 –

ответ

0

Создайте VM классы, как:

public class Data:INotifyPropertyChanged 
{ 
    public ObservableCollection<MyRecord> Items 
    { 
     get{ 
      return _items; 
     } 
     set{ 
      _items=value; 
      OnProperyChanged("Items") 
     } 
    } 

    public Data() 
    { 
     Items = new ObservableCollection<MyRecord>() 
     { 
       new MyRecord(){Title:"First",IsEnable:false}), 
       new MyRecord(){Title:"Second",IsEnable:false}) 
     }; 
    } 

    //--------------------------------------------------------------- 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnProperyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      var handler= PropertyChanged ; 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

public class MyRecord:INotifyPropertyChanged 
{ 
    private int _title; 
    private bool _isEnable; 

    public int Title 
    { 
     get 
     { 
      return _title; 
     } 
     set 
     { 
      _title= value; 
      OnProperyChanged("Title") 
     } 
    } 

    public bool IsEnable 
    { 
     get 
     { 
      return _isEnable; 
     } 
     set 
     { 
      _isEnable= value; 
      OnProperyChanged("IsEnable") 
     } 
    } 

    //--------------------------------------------------------------- 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnProperyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      var handler= PropertyChanged ; 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Теперь в вашем Xaml свяжи IsEnabled свойство каждого Button к соответствующему свойству ...

Вы можете написать следующий код с BooleanToVisibilityConverter:

//First add BooleanToVisibilityConverter to the window resources 


// When you know Items[0] is FIRST use some code like this>> 
IsEnabled="{Binding Items[0].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" 

Пример:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition></ColumnDefinition> 
     <ColumnDefinition></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <ListView ItemsSource="{Binding Items}" Grid.Column="0"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Label Content="{Binding .}"></Label> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    <Button Content="First" 
      IsEnabled="{Binding Items[0].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" 
      Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="21,24,0,0" VerticalAlignment="Top" Width="76"/> 
    <Button Content="Second" 
      IsEnabled="{Binding Items[1].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" 
      Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="102,48,0,0" VerticalAlignment="Top" Width="76"/> 
    <Button Content="First" 
      IsEnabled="{Binding Items[0].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" 
      Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="33,83,0,0" VerticalAlignment="Top" Width="76"/> 
    <Button Content="Second" 
      IsEnabled="{Binding Items[1].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" 
      Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="126,93,0,0" VerticalAlignment="Top" Width="76" RenderTransformOrigin="1.088,-0.075"/> 
    <Button Content="Second" 
      IsEnabled="{Binding Items[1].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" 
      Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="93,186,0,0" VerticalAlignment="Top" Width="76"/> 
</Grid> 

ОК, каждый все хорошо до этого шага. Теперь, если вы сделаете IsEnable недвижимость каждого пункта до TRUE, тогда кнопки должны быть Enabled И наоборот. Чтобы выполнить это, Вы можете:

  • Написать команду в классе данных и сделать привязку между каждым Список элемента и команды.
  • Используйте ListView.SelectionChanged событие, чтобы сделать IsEnable property of the Clicked, чтобы TRUE. Примечание: Теперь каждый тип в ListView равен MyRecord.
0

Лучшим решением для вашей проблемы является использование IValueConverter, в этом примере я создал обращенное имя GroupToBooleanConverter принимающего значение выбранного элемента в первом столбце параметра value и группы кнопок с помощью параметра параметра» », преобразователь код ниже:

public class GroupToBooleanConverter : IValueConverter 
{ 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      var selectedGroup = value as string; 
      var buttonGroup = (string)parameter; 

      return buttonGroup.Equals(selectedGroup); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

Теперь в XAML вы должны ссылаться на пространство имен своей очереди, в моем примере пространство имен новообращенный является namespaceOfConverter, и должны быть импортированы, чтобы преобразовать через него, выглядит следующим образом:

xmlns:converters="clr-namespace:namespaceOfConverter" 

Поместите attribute на свой Window тег в свой XAML.Теперь вы должны ссылаться на новообращенного, поставив его в Window ресурсы:

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

Я назвал ваше ListView из lsvGroups:

<ListView ItemsSource="{Binding Items}" x:Name="lsvGroups" Grid.Column="0"> 
.... 

Теперь просто использовать конвертер в кнопках, выполняя binding в собственности IsEnabled :

IsEnabled="{Binding SelectedItem, ElementName=lsvGroups,Converter={StaticResource GroupToBoolean},ConverterParameter=First}" 

OBs: на месте First вы о.е. t имя группы ассоциируется с button.

+0

Этот ответ разрешает вашу проблему? –

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