使用当前的实践(至少使用WPF和Silverlight),我们在视图模型中看到通过命令绑定绑定的视图,或者我们至少看到视图模型中处理的视图事件.这似乎违反了SRP,因为视图模型不仅模拟视图状态,而且响应视图(用户).其他人已经询问如何构建视图模型而不违反SRP或询问他们的实现是否这样做(最后是MVC中的控制器,但大致类似).
那么目前的做法是否违反了SRP?或者"视图模型"真的是一组不违反SRP的东西?为了解决这个问题,似乎我们需要知道什么是单一责任,或者如果概念中有多个责任,个别职责是否分开,符合SRP.我不确定.
[View] ViewModel是一个"视图模型",意思是它是View的抽象,也用于视图和模型之间的数据绑定
对于SRP而言,这似乎已经足够了,但后来这篇文章说明了(我强调了)
[ViewModel]充当数据绑定器/转换器,将模型信息更改为View信息,并将命令从View传递到模型
在一篇关于视图模型角色的Prism博客文章中,作者说(再次,我的重点)
它归结为视图模型是以下的组合:
- 视图的抽象
- 命令
- 价值转换器
- 查看状态
我确定我错过了许多定义,但它们似乎属于以下类别:
如果你很好奇,我"关心"这个因为(2)感觉正确,但似乎与普遍的实施相反.
silverlight wpf single-responsibility-principle mvvm viewmodel
这工作正常,并正确地将不间断的空格插入到字符串中:
<TextBlock Text="Non Breaking Text Here"></TextBlock>
Run Code Online (Sandbox Code Playgroud)
但我真正需要的是在数据绑定期间用不间断的空格替换空格.所以我写了一个简单的值转换器,用"  " 替换空格.它确实用"  " 替换空格,但"  "字面显示而不是显示为不间断的空格.这是我的转换器:
public class SpaceToNbspConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString().Replace(" ", " ");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
有人知道它为什么在XAML中工作,但不在代码中吗?
我正在使用 Visual Stuido 2022 来编写我的 C# 项目。
有没有一种方法可以使用(.editorconfig文件)在命名空间之前和之后添加新行来配置VS?
所以我的课程看起来像这样
using System;
namespace ProjectName.Tests;
public class Test
{
}
Run Code Online (Sandbox Code Playgroud)
代替
using System;
namespace ProjectName.Tests;
public class Test
{
}
Run Code Online (Sandbox Code Playgroud) 我经常看到并使用带有附加属性的枚举来做一些基本的事情,比如提供显示名称或描述:
public enum Movement {
[DisplayName("Turned Right")]
TurnedRight,
[DisplayName("Turned Left")]
[Description("Execute 90 degree turn to the left")]
TurnedLeft,
// ...
}
Run Code Online (Sandbox Code Playgroud)
并且有一组扩展方法来支持这些属性:
public static string GetDisplayName(this Movement movement) { ... }
public static Movement GetNextTurn(this Movement movement, ...) { ... }
Run Code Online (Sandbox Code Playgroud)
遵循此模式,可以将其他现有或自定义属性应用于字段以执行其他操作.它几乎就像枚举可以作为简单的枚举值类型一样工作,也可以作为一个包含许多字段的更丰富的不可变值对象:
public class Movement
{
public int Value { get; set; } // i.e. the type backing the enum
public string DisplayName { get; set; }
public string Description { get; set; }
public Movement GetNextTurn(...) { ... } …Run Code Online (Sandbox Code Playgroud) 我正在尝试验证输入到文本框中的日期.文本框上有一个输入掩码,强制输入xx/xx/xxxx.我正在尝试使用正则表达式验证程序来强制输入正确的日期.我根本不熟悉RegEx.我的同事在互联网上找到了这个,但我无法真正说出它在做什么.
这看起来不错吗?似乎过于复杂......
(^((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(((0[1-9])|(1[0-2]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$)
Run Code Online (Sandbox Code Playgroud)
有没有人知道一个不太复杂的表达,基本上做我需要的东西?
我刚刚开始使用DDD,我在确定如何适应数据的关系性质方面遇到了一些麻烦.我有我认为会被视为我的聚合根,但聚合也有自己的聚合.我不想违反德米特法则,我想知道我是否正在考虑这个错误,并希望一些DDD专家可以提供一些见解.
我的聚合根是我的Account对象,它有许多AccountElement实体的集合,它们本身就是各个ProductComponent实体的逻辑分组.
一个AccountElement的上下文之外Account已经没有任何意义,所以我很舒服,我的结论是,Account对象是我聚合根,我预计其总实体Elements属性.这是让ProductComponent我感到困惑的系列.该集料具有外没有任何意义AccountElement,而真正具有的外部没有任何意义Account.
我认为我不应该通过点击它来访问单个ProductComponent对象,例如:
var reference = account.Elements(0).ProductComponents(0).ReferenceCode;
Run Code Online (Sandbox Code Playgroud)
但与此同时,(从域的角度来看)ProductComponent直接从Account实体访问是没有意义的.
我确信如果不了解我的域名,这有点难以理解,但我希望这足以得到一些好的反馈.
我试图找出select使用Entity Framework对SQL Server做出的声明的文本内容.CommandTextIntelliTrace和调试器下的属性在文本视图中将文本截断为正好4096个字符.有没有办法看到所有这些或配置这些工具至少提高限制?
更新:这仍然是VS 2015诊断工具的一部分.
debugging entity-framework visual-studio watch-window intellitrace
我已经编写了代码来解析我的xml文件,XmlReader所以我不想重写它.我现在已经为程序添加了加密功能.我有encrypt()和decrypt()函数,它们采用xml文档和加密算法.我有一个使用xml阅读器来解析文件的函数,但现在使用xml文档我不知道如何创建xmlreader.
问题是如何将我的xml文档保存到流.我确信它很简单,但我对流不了解.
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(filep);
Decrypt(doc, key);
Stream tempStream = null;
doc.Save(tempStream); // <--- the problem is here I think
using (XmlReader reader = XmlReader.Create(tempStream))
{
while (reader.Read())
{ parsing code....... } }
Run Code Online (Sandbox Code Playgroud) Switch 表达式是在 C# 8 中引入的。代码库中有很多地方可以用这种新风格重写。
例如,我有一些代码,用于从字节流中解析数据包:
switch (command)
{
case Command.C1:
return new P1();
case Command.C2:
return new P2();
default:
stream.Position++;
return null;
}
Run Code Online (Sandbox Code Playgroud)
问题是 - 它不能转换为像这样的 switch 表达式
return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => { stream.Position++; return null; }
};
Run Code Online (Sandbox Code Playgroud)
我想到的第一件事是使用 a Func<>,它编译:
return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => new Func<AbstractPacket>(() => { stream.Position++; return null; })()
};
Run Code Online (Sandbox Code Playgroud)
F# 已经允许在每个分支中包含多个语句的代码:
match command …Run Code Online (Sandbox Code Playgroud) c# ×4
silverlight ×2
wpf ×2
.net ×1
c#-8.0 ×1
date ×1
debugging ×1
intellitrace ×1
javascript ×1
jquery ×1
mvvm ×1
regex ×1
single-responsibility-principle ×1
validation ×1
viewmodel ×1
watch-window ×1
whitespace ×1
xaml ×1
xmldocument ×1
xmlreader ×1