Tag: wpf

绑定到Model或ViewModel

我知道已经有关于这个主题的问题,但是那些问题在某种程度上与其他问题有关,并没有提供确凿的答案。 特别是那里: 问题1 , 问题2 ,当然还有问题3 所以请不要太快关闭这个问题 。 他们回答那里只是说“做这个,做那个”而不是为什么! 有些人否认需要ViewModel并且说“标准”方式是直接绑定到Model 。 这是我否认并试图用技术论证来certificate的。 从我在MVC , MVP , Presentation Model背景来看,使用ViewModel对我来说很自然。 也许我错过了一个重点? 所以对我来说,默认是绑定到ViewModel ,无论Model是什么(无论它是否实现了INotifyPropertyChanged )。 我看到绑定到ViewModel的原因有几个 ,包括(如此处提到的CodeProject和另一篇文章 ) 1.从视图中删除逻辑 使逻辑单元可测试 减少代码冗余(在需要时复制) 2.安全 该模型包含用户不得更改的属性 如果绑定到模型,则会发生自动但不需要的更新 3.松耦合 如果直接绑定到模型,则较低层和View之间将存在耦合 更改模型会导致所有视图中的更改 视图不依赖于任何给定的模型 可以使用EF,某些DSL,批处理文件等轻松生成模型 4.发展速度 您可以从Prototype ViewModel层次结构开始并绑定到该层次结构 如果模型仍在开发中,您可以从Prototype Model开始 Model和ViewModel可以开发testdriven,无论View如何 View可以完全由设计师或具有强大设计背景的开发人员构建 5.解决了“棘手的同步”问题 对于任何给定的“棘手同步”问题,有很多解决方案,例如 AutoMapper 模型中的事件系统(模型触发事件,ViewModel订阅) 6.整个项目的平等结构 有一些点需要ViewModel,比如SelectedItem 将Binding与Model和ViewModel混合是错误的 新鲜的开发人员很难弄清楚项目的结构 稍后开始带ViewModel时,无法绕过它是凌乱的 7.可扩展性 让我们定义:如果你不使用ViewModel,它不是MVVM MVVM可以很容易地被用于许多数据源,很多视图 […]

设置绑定边距

我有一个绑定值,返回一个int,表示我不能分配给元素的左右边距的值。 inheritance人我试过但它不会编译。 如果我设置整个边距,它可以工作,但我只想要左右。 XAML: 类: public int BondIndent { get { return _bondSequence * 5; } }

在WPF Treeview中根据枚举绑定图标

我在treeview TextBox,我想转换我的枚举: public enum AcceptationStatusGlobalFlag { NotReady = 0, Ready = 1, AcceptedByAdmin=2 } 到图标。 将有3个图标,比如ready.jpg,notready.jpg和AcceptedByAdmin.jpg 国家和地区有泳池AcceptationStatusGlobalFlag,我想要显示这个枚举/图标 <!—-> <!—->

WPF MouseDown事件在控件中无处处理

我目前正在与另一场WPF斗争作斗争,即mouseEvents。 我基本上有一个非常简单的控件(一个包含Grid的Border ,它本身有一些TextBlocks )。 我试图实现一个简单的行为:双击应该将控件转换为编辑模式(实际上隐藏TextBlocks与TextBoxes绑定到相同的数据。 没什么好看的吧? 好吧,我在挣扎。 链接到我的UserControl的MouseDoubleClick只是在我点击一个控件时触发(比如,点击一个文本块)。 如果我单击TextBlocks之间的空白区域,则不会触发任何内容。 MouseDown甚至都没有。 我怎么能让它工作以便抓住每一次鼠标点击? 我假设将MouseDown事件链接到Border应该捕获Border上的每次单击但是……它最终没有捕获边框空白部分的点击。 这是我为您制作的一些代码草案: XAML: 代码背后: private void Border_MouseDown(object sender, MouseButtonEventArgs e) { thetext.Visibility = Visibility.Visible; } private void Border_mouseUp(object sender, MouseButtonEventArgs e) { thetext.Visibility = Visibility.Collapsed; } 现在尝试单击其中一个“BLUFF”文本:将出现“已点击”文本。 尝试点击TextBlocks之间的其他地方:没有任何反应。 谢谢!

我可以在WPF中的单个TextBlock中使用多种颜色吗?

我在文本块中有一行文字,内容如下: “检测到[手势],准确度为[准确度]” 在WPF中,我是否可以更改文本块中元素的颜色? 我可以将文本块设置为多种颜色吗? 例如,我希望整个TextBlock是黑色的,除了手势名称,我想要红色。 这可能在WPF中吗?

从控制台应用程序重新打开WPF窗口

我想从Console应用程序打开一个WPF窗口。 在提到这篇文章后 ,它运作正常。 问题是:当用户关闭WPF窗口(手动)时,不能再从控制台重新打开它,抛出exception消息:“无法在同一AppDomain中创建多个System.Windows.Application实例。” 这是代码: class Program { static void Main(string[] args) { string input=null; while ((input = Console.ReadLine()) == “y”) { //Works fine at the first iteration, //But failed at the second iteration. StartWpfThread(); } } private static void OpenWindow() { //Exception(Cannot create more than one System.Windows.Application instance in the same AppDomain.) //is thrown […]

根据类型选择数据模板

我已经宣布了以下类型: public interface ITest { } public class ClassOne : ITest { } public class ClassTwo : ITest { } 在我的viewmodel中,我正在声明并初始化以下集合: public class ViewModel { public ObservableCollection Coll { get; set; } = new ObservableCollection { new ClassOne(), new ClassTwo() }; } 在我看来,我正在声明以下ItemsControl 我希望看到的是一个红色方块,后面是一个蓝色方块,而我所看到的是以下内容: 我究竟做错了什么?

将INotifyPropertyChanged添加到模型?

我在我的wpf MVVM(基于Prism的)应用程序中遇到了一些设计问题,很乐意得到你的建议。 我的模型非常简单: public class Customer { public string FirstName {get;set;} public string LastName {get;set;} } 如您所见,我的Model类没有任何INotifyPropertyChnaged支持。 我还在CustomerDetails屏幕上有ViewModel,它支持INotifyPropertyChanged。 public class CustomerDetailsViewModel:INotifyPropertyChanged /*Or NotificationObject*/ { /*INotifyPropertyChanged event */ private Customer item; public Customer Item { get{return item;} set { item=value; //Raise PropertyChanged //Set IsDirty to true } } } 在我看来,我正在使用绑定到Item.FirstName和我正在更新的ViewModel。 我的问题是 – 因为只有FirstName属性通过View更新,而Model本身不支持INotifyPropertyChanged,因此Item setter没有被调用,并且IsDirty仍然等于false(因此不会更新IsDirty通知)用户界面)。 我知道我可以在模型中支持INotifyPropertyChanged,然后在视图模型中注册到Item.PropertyChanged事件,并实际将IsDirty设置为true,但是 – […]

如何在WPF DataGrid中处理组小计和目标行?

我正在实现一个包含许多关键值的项目的WPF DataGrid。 项目按项目类别分组。 对于每个类别,应该有: 在每个关键值列中显示该行的所有行的总和的行。 绑定到的数据源网格中不属于目标行的目标行。 目标行告诉每一列当年的目标是什么(例如,要花多少钱)。 这些行应始终位于每个组的顶部(排序过滤)。 我的第一个解决方案是将这些数据放在组头中。 这不是一个好的解决方案,因为组头不支持列。 即它应该通过获得列宽来构造。 这可以做到,但是当用户想要重新排序和隐藏列时,它会变得复杂。 DataGrid使用的是CollectionViewSource,因此它没有填充C#代码。 基本上我正在扩展这个例子: http : //msdn.microsoft.com/en-us/library/ff407126.aspx 谢谢和最诚挚的问候 – matti

从DataGrid中选择DataGridCell

我有一个DataGrid WPF控件,我想获得一个特定的DataGridCell 。 我知道行和列索引。 我怎样才能做到这一点? 我需要DataGridCell因为我必须能够访问其内容。 因此,如果我(例如)有一个DataGridTextColum列,我的Content将是一个TextBlock对象。