C# C wpf datagrid,选择一个复选框应选择几个其他复选框

C# C wpf datagrid,选择一个复选框应选择几个其他复选框,c#,wpf,datagrid,C#,Wpf,Datagrid,选中某个复选框时,也不需要根据条件选择其他复选框。在这里,我试图用名称列表加载DataGrid,当我选择一个名称时,应该检查以相同字母开头的其他名称。 请建议我如何进行这项工作。 如何访问用户类中的用户列表 Xaml代码: 这样您就无法访问用户列表。您可以添加单击,例如: <CheckBox HorizontalAlignment="Center" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged,

选中某个复选框时,也不需要根据条件选择其他复选框。在这里,我试图用名称列表加载DataGrid,当我选择一个名称时,应该检查以相同字母开头的其他名称。 请建议我如何进行这项工作。 如何访问用户类中的用户列表

Xaml代码:


这样您就无法访问用户列表。您可以添加单击,例如:

 <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();
    }
}