C# C wpf datagrid,选择一个复选框应选择几个其他复选框
选中某个复选框时,也不需要根据条件选择其他复选框。在这里,我试图用名称列表加载DataGrid,当我选择一个名称时,应该检查以相同字母开头的其他名称。 请建议我如何进行这项工作。 如何访问用户类中的用户列表 Xaml代码:C# C wpf datagrid,选择一个复选框应选择几个其他复选框,c#,wpf,datagrid,C#,Wpf,Datagrid,选中某个复选框时,也不需要根据条件选择其他复选框。在这里,我试图用名称列表加载DataGrid,当我选择一个名称时,应该检查以相同字母开头的其他名称。 请建议我如何进行这项工作。 如何访问用户类中的用户列表 Xaml代码: 这样您就无法访问用户列表。您可以添加单击,例如: <CheckBox HorizontalAlignment="Center" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged,
这样您就无法访问用户列表。您可以添加单击,例如:
<CheckBox HorizontalAlignment="Center" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
Click="CheckBox_Click"/>
注意:如果您想在UI上通知它,则必须实现INotifyPropertyChanged以更新UI。首先,您的isSelected属性应该是私有的 Xaml 正如Hima_devils在上面所说的,如果你不想刷新整个数据网格,你可以在你的用户类和设置器中实现INotifyPropertyChanged
NotifyPropertyChangedDiselected 首先,我建议您将逻辑与UI(即窗口对象)分离。这意味着在名为的对象中使用和移动您的登录名 为了正常工作,应实现viewmodels。此接口表示一个对象,该对象在其属性之一更改其值时发出通知。因此,您可以使用此机制选择属于列表的其他用户 让我们看看如何。 首先,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;
}
}
因此,您的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>
如何在ViewModel中实现这一点,我尝试将其添加到我的模型中as@bhavani您是在谈论checkbox_onclick方法还是INotifyPropertyChanged实现?感谢您的帮助。我正在尝试使用ICommand实现类似的事件,即当选中checkbox时,执行ICommand并根据命令输出选择其他复选框。这是我的数据网格:当我选择项目时,不会触发复选框\单击,是否可以从Datatemplate实现ICommand?
<CheckBox HorizontalAlignment="Center" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
Click="CheckBox_OnClick"
/>
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();
}
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;
}
}
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);
}
}
}
}
<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>
public partial class MainWindow : Window
{
public MainWindow ()
{
InitializeComponent();
DataContext = new ViewModel();
}
}