似乎有一个指导,模型不应该将其实体暴露给View,并且所有必需的属性都应该在ViewModel中重复
例:
Product
Id {get; set;}
Name {get; set;}
.......
ProductViewModel : ViewModelBase
Id {get; set;}
Name {get; set;}
.......
Run Code Online (Sandbox Code Playgroud)
为什么需要这个?我可以理解,如果Model没有实现INPC,但如果确实如此,那么我觉得这很不必要.
在某些情况下,在应用程序运行期间,我需要打开身份插入:
modelBuilder.Entity<Activity>().Property(p => p.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)
但是,由于OnModelCreating只执行一次,实现这一目标的最佳方法是什么?是否有可能重建模型?
<UserControl .....>
<DataTemplate DataType="{x:Type vm:AViewModel}">
<vw:AView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:BViewModel}">
<vw:BView />
</DataTemplate>
<ContentControl x:Name="chartScreen" Content="{Binding Screen}" Background="Yellow" />
</UserControl>
Run Code Online (Sandbox Code Playgroud)
从上面的代码中可以看出,ContentControl通过绑定到ViewModel的Screen属性来设置其内容.Screen属性将返回AViewModel或BViewModel的实例,具体取决于某些条件.问题是,当在屏幕上加载UserControl时,Screen属性为null,因此还没有设置内容.此时,我想为ContentControl设置一些背景,但我找不到如何做到这一点的方法?背景="黄色"什么都不做......
任何想法如何设置ContentControl的背景?即使内容显示AView或Biew,也应该始终应用此背景,或者为null.
我想知道为什么MVVM光缺少命令与异步执行?我相信在很多情况下这可能会有用,所以让我说一个.
假设我们的UI包含一个包含多个屏幕的容器.用户可以关闭特定屏幕或具有多个屏幕的容器.假设用户已在容器上发出了关闭命令.返回的容器在每个屏幕上调用close命令,它需要等待屏幕关闭.实际上,这可能意味着验证数据.因此,我们需要发出异步调用以防止UI变得无响应,我们还需要等待任务完成,才能继续.
所以,如果我们在Command中有这样的东西
public RelayCommand CloseCommand
{
get { return _closeCommand ?? _closeCommand = new RelayCommand( async () =>
{
foreach (var screen in Screens)
{
if (!await screen.CloseCommand.ExecuteAsync(null))
{
// do something
}
}
}) }
}
Run Code Online (Sandbox Code Playgroud)
我们还可以在屏幕上公开其他方法,但在我看来它应该是RelayCommand的任务,因为它已经存在于那里.
或者有一种不同的方法来处理这种情况?
我正在构建一个桌面应用程序,它将在本地网络上使用SQL Server作为数据库。
此应用程序将同时拥有约50个用户。在哪种情况下我需要使用WCF服务?是否建议在要驻留数据库的服务器计算机上创建WCF服务,以便我们通过WCF服务连接到该服务器,而不是直接连接到数据库?建议使用什么方式连接到SQL Server数据,为什么?
编辑:让我更详细地解释。我以前使用过WCF Ria服务,所以我知道它们是如何工作的。让我们假设WCF服务以相同的方式工作。问题是针对为什么我们要使用WCF而不是直接连接到数据库?我不想指定我当前的应用程序要求,因为我将获得针对特定要求的特定答案。我的目标是大致了解为什么以及何时选择一个而不是另一个。到目前为止,我已经收到令人满意的答复。
在我看来,普遍共识是仅在需要另一种类型的应用程序时才使用WCF,该应用程序将使用Web访问从服务中获取数据。同样,如果我正确理解的话,从安全性的角度来看,两者之间没有区别。
将来会出现一个统计应用程序,该应用程序将使用Web向用户提供只读统计信息,并且自然会为此任务需要一些服务(应用程序没有特定的客户端,它将提供给许多客户端)。由于我需要针对特定客户快速完成一些演示应用程序,因此我在考虑忽略服务部分,并进行适当的分层(WPF-> VM-> Model-> EF,因此稍后我将在模型和EF。我认为使用插入层运行WPF应用程序应该花不了太多时间,我也推迟了该服务,原因如下:由于HTML5是(将要成为)Web的主要技术,并且有SL可能会被废弃为技术(我一直在使用),因此合理的决定是选择HTML5而不是SL5。
由于EF不支持唯一键约束,因此我们需要在Save方法期间捕获异常,并向用户显示错误消息.
这种方法的问题是:
DBMS是SqlServer 2008.
如何解决这些问题?
我有List MyBox:DynamicObject.MyType继承自DynamicObject的原因是我需要一个可以包含未知数量属性的类型.
一切正常,直到我需要过滤List.有没有办法可以做一个像这样做的linq:
return all items where any of the properties is empty string or white space?
Run Code Online (Sandbox Code Playgroud) 我是WPF设计(和一般设计)的新手,我需要一个任务的帮助.
我有一个按钮的样式,其中包含一个Path中的一些数据,它在其上绘制一个图标(基本上是简单的添加新图标).现在我想制作一个复制图标.
我找不到用Blend中的Path操作的方法,所以我想到的是:
1)复制路径数据,这样我们就可以绘制两个图标(在内容中有两个Path对象)2)先向左移动一小部分向上移动3)向右移动一小部分向右移动4)使第二个重叠第一个
这就是我所做的:因为我们不能为Content设置两个元素,所以我添加了一个Grid元素,并在内部复制了Path元素两次.然后我重新定位了两个路径来模拟重复数据.
<Setter Property="Content">
<Setter.Value>
<Grid>
<Path Data="..." Margin="10" Stretch="Fill" Fill="{StaticResource IconBrush}" RenderTransformOrigin="0.5,0.4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform Angle="-90" />
<TranslateTransform />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path Data="..." Margin="10" Stretch="Fill" Fill="{StaticResource IconBrush}" RenderTransformOrigin="0.5,0.6">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform Angle="-90" />
<TranslateTransform />
</TransformGroup>
</Path.RenderTransform>
</Path>
</Grid>
</Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)
问题:我没有与第二个图标重叠(基本上一切都是透明的.这意味着我可能需要在第一个图标上删除一些点,但我无法在Blend中实现这一点?
任何人都可以分享一些如何实现我的需求吗?
每个应用程序都包含一些可配置的设置。这些设置或多或少可以分为两类:
在我实现的架构中,View 有自己的项目(WPF),ViewModel 有自己的项目(类库)。从专业角度来看,View应该负责加载/保存视图相关设置,ViewModel应该负责加载/保存业务设置。
视图设置很容易处理。在设置(app.config)中创建所需的属性,您可以轻松加载保存它们。
但是,ViewModel 无法通过 View 项目中可用的内置机制访问 app.config 设置。
我的第一个想法是创建一些辅助方法,允许我从 ViewModel 读取/写入 app.config 中的设置。你有什么意见?我是否使事情变得复杂,或者这是处理应用程序设置的可接受的方式?
我试图理解为什么DbContext没有检测到多对多关系中的变化.这是我在模型配置中设置的:
this.Configuration.ValidateOnSaveEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
this.Configuration.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)
这是测试代码:
var book = Context.Set<Book>().Where(b => b.Id == 1).Single();
var author = Context.Set<Author>().Where(a => a.Id == 2).Single();
book.Authors.Add(author);
Run Code Online (Sandbox Code Playgroud)
如果我检查更改,它不报告任何:
// returns false
_context.ChangeTracker.Entries().Any(e => e.State == EntityState.Added || e.State == EntityState.Modified || e.State == EntityState.Deleted);
Run Code Online (Sandbox Code Playgroud)
如果我保存更改,则更改会正确更新到数据库.
// 1 record added to BookAuthors table
_context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
为什么DbContext没有跟踪多对多的变化?WCF不涉及,这是与Sql server的直接连接.
wpf ×4
mvvm ×3
c#-4.0 ×1
dynamic ×1
linq ×1
mvvm-light ×1
sql-server ×1
wcf ×1
wpf-controls ×1