我广泛使用Expression interaction的CallMethodAction以MVVM友好的方式处理来自XAML的事件.
我刚刚在VS2017中创建了一个新的WPF项目,现在我看到旧的Expression命名空间已经消失了.我在MSDN上找到了这个页面,这是我正在寻找的动作,但在引用该程序集并添加命名空间后,它不包含CallMethodAction.该页面适用于Silverlight,这是WPF,所以我担心行动不再可用.
那么有人知道它是否已被删除/替换?现在应该如何在viewmodel上调用事件处理程序?
(我知道InvokeCommandAction,但我更喜欢CallMethodAction,因为它会转发原始事件参数,并允许取消预览事件.)
编辑:只是为了前进我尝试了InvokeCommandAction但它不再以相同的方式工作,我找不到任何关于新用法的文档.
我确实在MSDN上找到了Microsoft.Xaml.Interactions命名空间的这个引用,该命名空间似乎包含我需要的类,但该程序集似乎不存在.
我觉得我在这里遗漏了一些明显的东西.我不知道他们如何能够对事件做出重大改变.
这实际上是良好形式/最佳实践的问题.我在C++中使用结构来形成基本上保存数据的对象,而不是创建一个具有大量访问器方法的类,这些方法除了获取/设置值之外什么都不做.例如:
struct Person {
std::string name;
DateObject dob;
(...)
};
Run Code Online (Sandbox Code Playgroud)
如果你想象那里有20个变量,把它写成一个有私人成员和40多个访问者的类是很难管理的,对我来说似乎很浪费.
有时候,我可能还需要为数据添加某种最小功能.在示例中,假设我有时也需要基于dob的年龄:
struct Person {
std::string name;
DateObject dob;
(...)
int age() {return calculated age from dob;}
}
Run Code Online (Sandbox Code Playgroud)
当然,对于任何复杂的功能,我都会创建一个类,但对于像这样的简单功能,这是"糟糕的设计"吗?如果我使用一个类,将数据变量保存为公共类成员是不好的形式,还是只需要接受它并使用一堆访问器方法创建类?我理解类和结构之间的差异,我只是询问最佳实践.
我最近在我们的一个大型项目上将EF 6.1.3升级到6.2.0,它打破了大量的LINQ查询.启用MultipleActiveResultSets会使所有内容再次正常工作,但我很难理解这一变化.我们多年来一直使用EF并且经历了多个主要版本更改而没有任何问题.如果我简单地回到6.1.3,一切都按预期再次运行 - 实际上即使我在6.1.3中明确禁用了MARS,一切都能正常工作.
让我举几个简单的例子.第一个问题是嵌套查询:
foreach(var row in dbSet.Where(<condition>))
foreach(var innerRow in otherDbSet.Where(_ => _.Property == row.Property))
Run Code Online (Sandbox Code Playgroud)
这在6.1.3中工作正常,但在6.2.0中抛出"已经有一个打开的DataReader ......"异常.我理解异常的本质,我可以通过在外部查询上调用ToList()来将结果推送到内存中来解决这个问题 - 我不明白为什么我不必在6.1.3中这样做(即使MARS禁用).简单地将整个外部集合加载到存储器中并不总是令人满意的.
这似乎也会影响延迟加载的属性.例如,我们从简单的查询构建ComboBoxes,如下所示:
return db.Collection
.Where(<condition>)
.AsEnumerable()
.Select(_ => new ListItem(_.Id, _.LazyNavigationProperty.Description))
.ToList();
Run Code Online (Sandbox Code Playgroud)
这在6.1.3中工作正常,但在6.2.0中再次抛出"已经有一个打开的DataReader ..."异常.修复是我现在必须急于加载导航属性.
最后我没有明确的问题,我只是想了解为什么次要版本更新似乎导致了查询处理方式的重大变化.
展望未来,这会对我们进行重构提出太多疑问.当我研究这个问题时,我看到了关于启用MARS的模糊警告,但没有人真正给出任何具体的东西.是否有令人信服的理由不启用它?
我在外部程序集中有一个资源字典,该字典已合并到我的app.xaml中,如下所示:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/My.Library;component/Theme.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
我希望使用StaticResource绑定引用上述资源。
我在Visual Studio 2013中收到设计时错误,指出资源不存在。我没有收到任何编译器错误,并且资源在运行时确实显示良好。
我已经阅读了有关VS Designer无法正确显示外部资源的问题的帖子,但是我没有使用Designer,这不是我的问题。我在错误窗口中收到错误消息,指出资源无法解析,并且我遇到了严重的问题。我已经尝试完全清洁和重建。
同样,所有内容都可以编译并正常运行,但这并不是很方便,因为我现在必须在错误列表中进行筛选,以查看实际错误以及什么是Visual Studio无法正确解析引用的资源。
对于咧嘴笑,我确实尝试过切换到DynamicResource,确实错误消失了。但是,这些资源在应用程序生命周期中不会改变,并且我不希望仅为了解决IDE问题而承担所有额外的开销。
有人知道对此有适当的解决方法吗?
这就是我一直写的事件提升者; 例如PropertyChanged:
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string name)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(name));
}
Run Code Online (Sandbox Code Playgroud)
然而,在最新的Visual Studio中,灯泡thingamabob建议将代码简化为:
private void RaisePropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
Run Code Online (Sandbox Code Playgroud)
虽然我总是赞成简化,但我想确保这是安全的.在我的原始代码中,我将处理程序分配给变量以防止订阅者在空检查和调用之间处置的竞争条件.在我看来,新的简化形式将遭受这种情况,但我想看看是否有人可以确认或否认这一点.
这可能是一个愚蠢的问题,但请考虑以下伪代码:
struct Person {
std::string name;
};
class Registry {
public:
const std::string& name(int id) const {return _people[id].name;}
void name(int id, const std::string& name) { [[scoped mutex]]; _people[id].name = name;}
private:
std::map<int, Person> _people;
};
Run Code Online (Sandbox Code Playgroud)
在这个简单的示例中,假设Registry是一个将由多个线程访问的单例.我在一个改变数据的操作期间锁定,但在非变异访问期间不锁定.
这个线程是安全的,还是我还应该在读取操作期间锁定?我阻止多个线程同时尝试修改数据,但我不知道如果一个线程在另一个写入的同时尝试读取会发生什么.
我需要创建以枚举为键的函数映射,但如果我使用 Record<> 实用程序类型,则似乎需要所有枚举值都存在于映射对象中。我需要它们都是可选的。例如:
enum ContentType {
Text,
Image,
Video,
}
type MapFn = (value: string) => string;
type ContentTypeMap = Record<ContentType, MapFn>;
const myMap = {
[ContentType.Text] : (value:string) => (value.toUpperCase),
} as ContentTypeMap;
Run Code Online (Sandbox Code Playgroud)
结果是:
Conversion of type '{ 0: (value: string) => () => string; }' to type 'ContentTypeMap' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
Type '{ 0: (value: string) => …Run Code Online (Sandbox Code Playgroud) 我希望这不是太模糊,但我只是学习使用NUnit和Moq进行单位测试.我理解这些概念,并且我可以毫不费力地为执行简单任务的逻辑方法编写测试,例如操纵某些值或调用伪造服务.但我正在试图弄清楚如何测试如下所示的东西,这是一种需要进行数据调用并具有多个依赖关系的方法.
这是我必须根据数据库对用户进行身份验证的类:
class Authenticator: IAuthenticator
{
private IConnectionHelper _connHelper;
public Authenticator(IConnectionHelper connHelper)
{
_connHelper = connHelper;
}
public string UserId { get; set; }
public string Password { get; set; }
public UserModel User { get; private set; }
public bool ValidateUser()
{
if (string.IsNullOrEmpty(UserId))
return false;
if (string.IsNullOrEmpty(Password))
return false;
using (Entities db = new Entities(_connHelper))
{
MD5 md5 = MD5.Create();
byte[] inputBytes = Encoding.ASCII.GetBytes(this.Password);
byte[] hash = md5.ComputeHash(inputBytes);
string md5Hash = BitConverter.ToString(hash).ToUpper().Replace("-", string.Empty);
var query = from u …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它创建Process对象以启动外部应用程序.一旦它验证应用程序已正确启动,它就不再关心它,所以我不再需要Process对象,但我不能在它上面调用Dispose(),因为我不想关闭该进程.这是什么解决方法?