2016-01-12 3 views
0

Когда выбрано значение CheckBox, необходимо также выбрать несколько других пользователей на основе условия. Здесь я пытаюсь загрузить DataGrid со списком имен, когда я выбираю одно имя, следует проверить другие имена, начинающиеся с одной буквы. Пожалуйста, предложите мне, как это сделать. Как я могу получить доступ к списку пользователей в классе «Пользователи»?C# wpf datagrid, выбрав один флажок, должен выбрать несколько других

код Xaml:

namespace WpfApplication2 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      List<User> users = new List<User>(); 
      users.Add(new User() { Id = 1, Name = "John Doe" }); 
      users.Add(new User() { Id = 2, Name = "Jane Doe"}); 
      users.Add(new User() { Id = 3, Name = "Sammy Doe" }); 
      users.Add(new User() { Id = 3, Name = "Abhi" }); 
      users.Add(new User() { Id = 3, Name = "Amy" }); 
      users.Add(new User() { Id = 3, Name = "Arin" }); 
      users.Add(new User() { Id = 3, Name = "Kate" }); 
      users.Add(new User() { Id = 3, Name = "Kane" }); 
      dgUsers.ItemsSource = users; 
     } 
    } 

    public class User 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public bool isSelected; 
     public bool IsSelected 
     { 
      get 
      {  
       //I can implement my condition here, but how to access the users list? 
       return this.isSelected; 
      } 
      set 
      { 
       this.isSelected = value; 
      } 
     } 
    } 
} 

ответ

0

Таким образом, вы не можете получить доступ к списку пользователей. Вы можете добавить щелчок, такие как:

<CheckBox HorizontalAlignment="Center" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
              Click="CheckBox_Click"/> 

xaml.cs код,

private void CheckBox_Click(object sender, RoutedEventArgs e) 
     { 

      var checkBox = sender as CheckBox; 
      //checkBox.IsChecked 

      //here you found checkbox IsChecked Property based on value you can write your code here. 
     } 

Примечание: Если вы хотите, чтобы уведомить его UI, чем вы должны реализовать INotifyPropertyChanged для обновления пользовательского интерфейса.

+0

Благодарим за ваша помощь.Я пытаюсь реализовать подобное событие с помощью ICommand i.e, когда установлен флажок, выполните ICommand и выберите другие флажки в зависимости от вывода команды. – bhavani

+0

Вот мой datagrid: – bhavani

+0

bhavani

0

Прежде всего ур - это свойство, которое должно быть закрыто.

Xaml

<CheckBox HorizontalAlignment="Center" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
             Click="CheckBox_OnClick" 
            /> 

MainWindow.cs

private void CheckBox_OnClick(object sender, RoutedEventArgs e) 
    { 
     var checkbox = sender as CheckBox; 

     string name = (checkbox.DataContext as User).Name; 
     var users = dgUsers.ItemsSource; 
     foreach (var item in dgUsers.ItemsSource) 
     { 
      var test = item as User; 
      test.IsSelected = true; 
     } 

     dgUsers.Items.Refresh(); 
    } 

AS сказал выше, Hima_devils, если вы не хотите, чтобы обновить весь ур DataGrid и может реализовать INotifyPropertyChanged в классе пользователя и внутри ур сеттер u будет

NotifyPropertyChanged ("IsSelected");

+0

Спасибо, это отлично работает. – bhavani

+0

Как реализовать это в ViewModel, я попытался добавить к моей модели как – bhavani

+0

@bhavani Вы говорите о методе checkbox_onclick или реализации INotifyPropertyChanged? – Guillaume

0

Прежде всего, я предлагаю вам отделить вашу логику от пользовательского интерфейса (т. Е. Вашего объекта Window). Это означает использование data binding и перемещение вашего логина в объекте под названием ViewModel.

Для правильной работы в нормальном режиме ваши модели должны реализовывать INotifyPropertyChanged. Этот интерфейс представляет собой объект, который уведомляет, изменит ли его один из своих свойств его значение. Таким образом, вы можете использовать этот механизм для выбора других пользователей, принадлежащих к списку.

Посмотрим, как. Прежде всего ViewModel:

public class ViewModel : PropertyChangedBase, IWeakEventListener 
{ 
    private List<User> users = new List<User>(); 
    private bool suspendListening; 

    public ViewModel() 
    { 
     users.Add(CreateUser(1, "John Doe")); 
     users.Add(CreateUser(2, "Jane Doe")); 
     users.Add(CreateUser(3, "Sammy Doe")); 
     users.Add(CreateUser(3, "Abhi")); 
     users.Add(CreateUser(3, "Amy")); 
     users.Add(CreateUser(3, "Arin")); 
     users.Add(CreateUser(3, "Kate")); 
     users.Add(CreateUser(3, "Kane")); 
    } 

    public IList<User> Users 
    { 
     get 
     { 
      return users; 
     } 
    } 

    private User CreateUser(int id, string name) 
    { 
     User user = new User(); 
     user.Id = id; 
     user.Name = name; 

     PropertyChangedEventManager.AddListener(user, this, String.Empty); 

     return user; 
    } 

    bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e) 
    { 
     if (managerType == typeof(PropertyChangedEventManager)) 
     { 
      PropertyChangedEventArgs propertyChangedEventArgs = e as PropertyChangedEventArgs; 
      User changedUser = sender as User; 
      if (propertyChangedEventArgs.PropertyName == "IsSelected" && changedUser.IsSelected && !suspendListening) 
      { 
       try 
       { 
        suspendListening = true; 
        foreach (User user in users) 
        { 
         if (user.Id == changedUser.Id) 
         { 
          user.IsSelected = true; 
         } 
        } 
       } 
       finally 
       { 
        suspendListening = false; 
       } 
      } 

      return true; 
     } 

     return false; 
    } 
} 

где PropertyChangedBase базовый класс, который реализует INotifyPropertyChanged. Кроме того, я использовал weak events для проверки, когда пользователь выбран. Как вы можете видеть, выбираете ли вы пользователя, а другой пользователь с тем же идентификатором, который был выбран автоматически. Ваш User класс должен извлечь из PropertyChangedBase тоже:

public class User : PropertyChangedBase 
{ 
    private bool isSelected; 

    public int Id { get; set; } 
    public string Name { get; set; } 

    public bool IsSelected 
    { 
     get 
     { 
      return isSelected; 
     } 
     set 
     { 
      if (isSelected != value) 
      { 
       isSelected = value; 
       NotifyOfPropertyChange<bool>(() => IsSelected); 
      } 
     } 
    } 
} 

так что ваш XAML будет:

<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False" CanUserAddRows="false"> 
    <DataGrid.Columns> 
     <DataGridCheckBoxColumn Binding="{Binding IsSelected, Mode=TwoWay}" /> 
     <DataGridTextColumn Binding="{Binding Id}" /> 
     <DataGridTextColumn Binding="{Binding Name}" /> 
    </DataGrid.Columns> 

</DataGrid> 

Только не забудьте инициализировать свойство DataContext вашего окна:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel(); 
    } 
} 
Смежные вопросы