微软应该已经实现了一些有趣的东西INotifyPropertyChanged,就像在自动属性中一样,只需指定{get; set; notify;}
我认为这样做很有意义.或者有任何并发症吗?
我们自己可以在我们的属性中实现类似'notify'的内容.是否有一个优雅的解决方案,INotifyPropertyChanged在您的班级实施或唯一的方法是通过提高PropertyChanged每个属性中的事件.
如果没有,我们可以写一些东西来自动生成一段代码来引发PropertyChanged 事件吗?
在Model-View-ViewModel体系结构WPF应用程序中实现ViewModel时,似乎有两个主要选择如何使其成为databindable.我已经看到了DependencyProperty用于View将要绑定的属性的实现,我已经看到了实现的ViewModel INotifyPropertyChanged.
我的问题是我应该何时优先选择其中一个?有任何性能差异吗?将ViewModel依赖项提供给WPF真的是个好主意吗?做出设计决定时还需要考虑什么?
有没有办法自动获得类中属性更改的通知,而无需在每个setter中编写OnPropertyChanged?(如果有更改,我有数百个我想知道的属性).
安东建议使用动态代理.我实际上使用过"Castle"库来获得类似的东西,虽然它确实减少了我必须编写的代码量,但它增加了大约30秒到我的程序启动时间(ymmv) - 因为它是一个运行时方案.
我想知道是否有编译时解决方案,可能使用编译时属性...
Slashene和TcKs给出了产生重复代码的建议 - 遗憾的是,并非所有属性都是m_Value = value的简单情况 - 很多都在setter中有自定义代码,所以来自代码片段和xml的cookie-cutter代码实际上不可行我的项目也是.
什么在UWP中使用,Binding或者x:Bind它们之间有什么区别?
因为我看到人们使用的很多帖子,Binding我只x:Bind在UWP中绑定.
在MSDN首页只说:"通过创建装订物体{x:Bind}并{Binding}在很大程度上是功能相当的." 那x:Bind是快.
但它们之间有什么区别?
因为"在很大程度上与功能相当"并不意味着相当.
我的报价链接:MSDN
所以我的问题是:
使用Binding或x有什么区别:在UWP中绑定?
nameof在C#中包含运算符的情绪很多.作为此运算符如何工作的示例,nameof(Customer.Name)将返回字符串"Name".
我有一个域对象.我必须绑定它.然后我需要属性的名称作为字符串.我希望它们是类型安全的.
我记得在.NET 3.5中遇到过一种解决方法,它提供了nameoflambda表达式的功能和涉及的lambda表达式.但是,我无法找到此解决方法.任何人都可以为我提供这种解决方法吗?
我也对nameof如果可能的话在.NET 2.0中实现功能的方法感兴趣.
在MVVM中,通过数据绑定将View连接到ViewModel是很正常的.
因此,如果属性的名称在其中一个模型对象上更改为数据绑定到没有编译器错误.
当编译器不会阻止错误时,我想到的下一件事是"UnitTest",但是
如何在不花费永远编写GUI测试的情况下对其进行单元测试?
是否有一个系统会检查所有绑定的属性是否有效(无需运行UI)我可以在单元测试中调用?
我正在寻找能够获取视图的内容,然后循环遍历所有WPF控件,对于每个WPF控件,它将查看所有绑定并检查它们是否有效.
顺便提一下,关于如何使OnPropertyChanged安全,和/或如何测试它有一些很好的问题(但是这些完成后可以达到WPF视图的水平.)
我已经对这个问题给予了赏金,因为有人必须认真思考这个问题并提出解决方案.
实现INotifyPropertyChanged接口时,每次在类中更新属性时,您都要负责调用PropertyChanged事件.
这通常会导致以下代码:
public class MyClass: INotifyPropertyChanged
private bool myfield;
public bool MyField
{
get { return myfield; }
set
{
if (myfield == value)
return;
myfield = value;
OnPropertyChanged(new PropertyChangedEventArgs("MyField"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler h = PropertyChanged;
if (h != null)
h(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
这是每个属性12行.
如果一个人能够装饰这样的自动属性会简单得多:
[INotifyProperty]
public double MyField{ get; set; }
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这是不可能的(例如,请参阅msdn上的这篇文章)
如何减少每个属性所需的代码量?
.net c# automatic-properties inotifypropertychanged .net-3.5
更改属性的名称并期望Visual Studio中的重命名功能必须处理所有必需的重命名,但INotifyPropertyChanged的PropertyChanged事件的属性名称除外.有没有更好的方法以某种方式获得强类型,所以你不需要记得手动重命名它?
这可能适用于其他地方,但在WinForms中,当我使用绑定时,我发现许多方法都希望将属性的名称绑定到.就像是:
class Person
{
public String Name { get { ... } set { ... } }
public int Age { get { ... } set { ... } }
}
class PersonView
{
void Bind(Person p)
{
nameControl.Bind(p,"Name");
ageControl.Bind(p,"Age");
}
}
Run Code Online (Sandbox Code Playgroud)
我一直遇到的一个大问题是"Name"和"Age"被指定为字符串.这意味着如果有人重命名Person的一个属性,编译器就无济于事.代码编译正常,但绑定将被破坏.
我错过了解决这个问题的标准方法吗?感觉我需要一些关键字,也许叫做stringof来匹配现有的typeof.你可以使用它:
ageControl.Bind(p,stringof(p.Age).Name);
Run Code Online (Sandbox Code Playgroud)
stringof可以返回一些具有获取完整路径,路径的一部分或字符串的属性的类,以便您可以自己解析它.
这样的事情已经可以吗?
c# ×6
.net ×4
data-binding ×3
.net-3.5 ×2
mvvm ×2
winforms ×2
wpf ×2
.net-2.0 ×1
architecture ×1
unit-testing ×1
uwp ×1
xaml ×1