如何创建像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)
如果我不想使用循环,我可能会做的是,正如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示例
不幸的是,您的示例接近能够处理布尔值的“更改”事件,但不完全是。您的示例仅允许处理对集合的更改,而不是对其内部元素之一的更改。
为此,您需要实现INotifyPropertyChanged,这是一个示例。尽管记住有一百万种通知机制,所以还是要对其进行一些研究。
要回答您的问题(“当元素的属性更改时,如何更新集合的其他成员”),您需要在您的情况下处理特定属性的更改事件IsResponsiblePerson。然后,在该处理程序中,您可以使用 Linq (它内部使用循环),但无论发生什么,您始终必须对整个列表执行操作(也许可能会提前中断循环)才能实现您所要求的。
另一个需要研究的概念是ObservableObject,与 密切相关INotifyPropertyChanged。这是有关它的文档
| 归档时间: |
|
| 查看次数: |
282 次 |
| 最近记录: |