仅在一个对象上设置属性

use*_*369 8 c#

如何创建像RadioButton这样的布尔属性?你知道,就像RadioButton一样,只能选择一个吗?

比如下面的例子.

当我将一个Employee设置IsResponsiblePerson为true时,它应该将所有其他Employee 设置为false.不使用循环.

var list = new ObservableCollection<Employee>();

public class Employee
{
    public string Name{get;set;}
    public string Surname{get;set;}
    public bool IsResponsiblePerson{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

Pik*_*koh 5

如果我不想使用循环,我可能会做的是,正如Lasse V. Karlsen在评论中所说,在另一个属性中存储"ResponsiblePerson"的名称:

static string ResponsiblePerson {get;set;}
Run Code Online (Sandbox Code Playgroud)

并将IsResponsiblePerson属性更改为以下内容:

public bool IsResponsiblePerson 
{ 
    get 
    { 
        return this.Name == ResponsiblePerson; 
    }
    set 
    {   
        if (value)
        {
             ResponsiblePerson = this.Name;
        }
        else
        {
            if (this.Name == ResponsiblePerson)
            {
                ResponsiblePerson = "";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例代码:

List<Employee> employees = new List<Employee>() { new Employee() { Name = "name1" },
                                                    new Employee() { Name = "name2" },
                                                    new Employee() { Name = "name3" } };

Employee emp1 = employees.Where(x => x.Name == "name1").First();
emp1.IsResponsiblePerson = true;

Employee emp2 = employees.Where(x => x.Name == "name2").First();
emp2.IsResponsiblePerson = true;

foreach (Employee e in employees) 
{ 
     Console.WriteLine(e.IsResponsiblePerson); //false true false
}
Run Code Online (Sandbox Code Playgroud)

我在这里制作了一个DotNetFiddle示例


Dan*_*son 1

不幸的是,您的示例接近能够处理布尔值的“更改”事件,但不完全是。您的示例仅允许处理对集合的更改,而不是对其内部元素之一的更改。

为此,您需要实现INotifyPropertyChanged这是一个示例。尽管记住有一百万种通知机制,所以还是要对其进行一些研究。

要回答您的问题(“当元素的属性更改时,如何更新集合的其他成员”),您需要在您的情况下处理特定属性的更改事件IsResponsiblePerson。然后,在该处理程序中,您可以使用 Linq (它内部使用循环),但无论发生什么,您始终必须对整个列表执行操作(也许可能会提前中断循环)才能实现您所要求的。

另一个需要研究的概念是ObservableObject,与 密切相关INotifyPropertyChanged这是有关它的文档