标签: mvvm

如何将WPF中的命令绑定到控件的双击事件处理程序?

我需要将文本块的双击事件(或者可能是图像 - 无论哪种方式,它的用户控件)绑定到我的ViewModel中的命令.

TextBlock.InputBindings似乎没有正确绑定到我的命令,任何帮助?

data-binding wpf command double-click mvvm

62
推荐指数
4
解决办法
7万
查看次数

MVVM:将单选按钮绑定到视图模型?

编辑:问题已在.NET 4.0中修复.

我一直在尝试使用IsChecked按钮将一组单选按钮绑定到视图模型.在审查其他帖子后,该IsChecked属性似乎根本不起作用.我已经整理了一个简短的演示,可以重现这个问题,我在下面列出了这个问题.

这是我的问题:使用MVVM绑定单选按钮是否有直接可靠的方法?谢谢.

附加信息:IsChecked物业不起作用有两个原因:

  1. 选择按钮后,组中其他按钮的IsChecked属性不会设置为false.

  2. 选择按钮后,第一次选择按钮后,其自身的IsChecked属性不会被设置.我猜测绑定在第一次点击时被WPF破坏了.

演示项目:以下是重现问题的简单演示的代码和标记.创建一个WPF项目并使用以下内容替换Window1.xaml中的标记:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
    <StackPanel>
        <RadioButton Content="Button A" IsChecked="{Binding Path=ButtonAIsChecked, Mode=TwoWay}" />
        <RadioButton Content="Button B" IsChecked="{Binding Path=ButtonBIsChecked, Mode=TwoWay}" />
    </StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

使用以下代码(hack)替换Window1.xaml.cs中的代码,该代码设置视图模型:

using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = …
Run Code Online (Sandbox Code Playgroud)

c# wpf binding mvvm radio-button

61
推荐指数
3
解决办法
6万
查看次数

使用MVVM管理多个选择

在我学习MVVM的过程中,我已经建立了对WPF和ViewModel模式的一些基本理解.我在提供列表时使用以下抽象,并且对单个选定项目感兴趣.

public ObservableCollection<OrderViewModel> Orders { get; private set; }
public ICollectionView OrdersView
{
    get
    {
        if( _ordersView == null )
            _ordersView = CollectionViewSource.GetDefaultView( Orders );
        return _ordersView;
    }
}
private ICollectionView _ordersView;

public OrderViewModel CurrentOrder 
{ 
    get { return OrdersView.CurrentItem as OrderViewModel; } 
    set { OrdersView.MoveCurrentTo( value ); } 
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以将OrdersView与支持排序和过滤绑定到WPF中的列表:

<ListView ItemsSource="{Binding Path=OrdersView}" 
          IsSynchronizedWithCurrentItem="True">
Run Code Online (Sandbox Code Playgroud)

这对单选视图非常有效.但我还想支持视图中的多个选择,并让模型绑定到所选项的列表.

如何将ListView.SelectedItems绑定到ViewModel上的backer属性?

.net c# data-binding mvvm

59
推荐指数
2
解决办法
5万
查看次数

MVVM Light Toolkit示例

有谁知道使用MVVM Light Toolkit创建的opensource WPF应用程序?或者任何样品?

c# wpf toolkit mvvm mvvm-light

59
推荐指数
4
解决办法
4万
查看次数

ICommand MVVM实现

所以在我正在做的这个特定的MVVM实现中,我需要几个命令.我真的厌倦了逐个实现ICommand类,所以我提出了一个解决方案,但我不知道它有多好,所以任何WPF专家的输入都将非常感激.如果你能提供更好的解决方案,那就更好了.

我所做的是一个ICommand类和两个代理,它们将一个对象作为参数,一个委托是void(对于OnExecute),另一个是bool(对于OnCanExecute).因此,在我的ICommand的构造函数(由ViewModel类调用)中,我发送了两个方法,并在每个ICommand方法上调用委托的方法.

它的效果非常好,但我不确定这是不是一个糟糕的方法,或者是否有更好的方法.下面是完整的代码,任何输入都会非常感激,甚至是负面的,但请建设性的.

视图模型:

public class TestViewModel : DependencyObject
{
    public ICommand Command1 { get; set; }
    public ICommand Command2 { get; set; }
    public ICommand Command3 { get; set; }

    public TestViewModel()
    {
        this.Command1 = new TestCommand(ExecuteCommand1, CanExecuteCommand1);
        this.Command2 = new TestCommand(ExecuteCommand2, CanExecuteCommand2);
        this.Command3 = new TestCommand(ExecuteCommand3, CanExecuteCommand3);
    }

    public bool CanExecuteCommand1(object parameter)
    {
        return true;
    }

    public void ExecuteCommand1(object parameter)
    {
        MessageBox.Show("Executing command 1");
    }

    public bool CanExecuteCommand2(object parameter)
    {
        return true;
    }

    public void ExecuteCommand2(object parameter)
    { …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf mvvm icommand

58
推荐指数
4
解决办法
12万
查看次数

在MVVM模型中该模型应该实现INotifyPropertyChanged接口吗?

我有清晰的思路View,并ViewModel在MVVM模式.我打算在我的应用程序中实现MVVM模式.我正面临关于模型的问题.我有.xml文件,它被解析,信息显示在视图中.

我需要第一次收到有关模型更改的通知.从需求开始我需要得到通知.

那么如何实现该模型呢?

我应该INotifyPropertyChanged在模型类中实现接口吗?(我读过该模型不应该实现INotifyPropertyChanged接口,因为它是WPF特定的)

.net wpf design-patterns mvvm inotifypropertychanged

57
推荐指数
5
解决办法
2万
查看次数

使用MVVM进行适当的验证

警告:非常详细的帖子.

好的,在使用MVVM时验证WPF.我现在已经阅读了很多东西,看了很多SO问题,并尝试了很多方法,但是在某些方面我觉得有点哈哈,我真的不确定如何以正确的方式做到这一点.

理想情况下,我希望在视图模型中使用IDataErrorInfo; 这就是我做的.然而,有不同的方面使得该解决方案不是整个验证主题的完整解决方案.

情况

我们采用以下简单形式.如你所见,它没什么特别的.我们只有两个文本框,它们分别绑定到视图模型中的a stringintproperty.此外,我们有一个绑定到的按钮ICommand.

只有字符串和整数输入的简单形式

因此,对于验证,我们现在有两个选择:

  1. 只要文本框的值发生变化,我们就可以自动运行验证.因此,当用户输入无效的内容时,用户会得到即时响应.
    • 我们可以更进一步,在出现任何错误时禁用该按钮.
  2. 或者我们只能在按下按钮时显式运行验证,然后显示所有错误(如果适用).显然我们无法在此处禁用错误按钮.

理想情况下,我想实现选择1.对于激活的普通数据绑定,ValidatesOnDataErrors这是默认行为.因此,当文本更改时,绑定会更新源并触发IDataErrorInfo对该属性的验证; 错误报告回视图.到现在为止还挺好.

视图模型中的验证状态

有趣的是让视图模型或这种情况下的按钮知道是否有任何错误.方式IDataErrorInfo有效,主要是将错误报告给视图.因此,视图可以轻松查看是否存在任何错误,显示它们甚至显示注释Validation.Errors.此外,验证总是发生在单个属性上.

因此,让视图模型知道何时出现任何错误,或者验证是否成功,是非常棘手的.一个常见的解决方案是简单地触发IDataErrorInfo视图模型本身中所有属性的验证.这通常使用单独的IsValid属性来完成.好处是,这也可以很容易地用于禁用命令.缺点是这可能会经常对所有属性进行验证,但大多数验证应该足够简单,不会影响性能.另一个解决方案是记住哪些属性使用验证产生错误并且只检查那些,但这似乎有点过于复杂并且大多数时候都是不必要的.

最重要的是,这可以正常工作.IDataErrorInfo为所有属性提供验证,我们可以简单地在视图模型本身中使用该接口来为整个对象运行验证.介绍问题:

绑定异常

视图模型使用实际类型作为其属性.所以在我们的例子中,整数属性是实际的int.视图中使用的文本框本身仅支持文本.因此,当绑定到int视图模型时,数据绑定引擎将自动执行类型转换 - 或者至少它会尝试.如果你可以在一个用于数字的文本框中输入文本,那么内部不会总是存在有效数字的可能性很高:所以数据绑定引擎将无法转换并抛出一个FormatException.

数据绑定引擎抛出异常,并在视图中显示

从观点来看,我们可以很容易地看到这一点.来自绑定引擎的异常会被WPF自动捕获并显示为错误 - 甚至不需要启用Binding.ValidatesOnExceptionssetter中抛出的异常所需的异常.错误消息确实有一个通用文本,所以这可能是一个问题.我通过使用Binding.UpdateSourceExceptionFilter处理程序,检查抛出的异常并查看source属性然后生成一个不太通用的错误消息来解决这个问题.所有这些都封装在我自己的Binding标记扩展中,所以我可以拥有我需要的所有默认值.

所以观点很好.用户出错,看到一些错误反馈并可以纠正它.然而,视图模型丢失了.当绑定引擎抛出异常时,源从未更新过.因此,视图模型仍然是旧值,这不是向用户显示的内容,并且IDataErrorInfo验证显然不适用.

更糟糕的是,视图模型没有很好的方法来了解这一点.至少,我还没有找到一个好的解决方案.可能的是让视图报告返回到视图模型,表明存在错误.这可以通过将Validation.HasError属性绑定到视图模型(这是不可能直接)的数据来完成,因此视图模型可以首先检查视图的状态.

另一种选择是将处理的异常中继Binding.UpdateSourceExceptionFilter到视图模型中,因此也会通知它.视图模型甚至可以为绑定提供一些接口来报告这些内容,允许自定义错误消息而不是通用的每类型消息.但是这会产生从视图到视图模型的更强耦合,我通常希望避免这种耦合.

另一个"解决方案"是删除所有类型属性,使用普通string属性并在视图模型中进行转换.这显然会将所有验证都移到视图模型中,但也意味着数据绑定引擎通常会处理大量重复的事情.此外,它将改变视图模型的语义.对我来说,视图是为视图模型而不是反过来构建的 - 当然视图模型的设计取决于我们想象的视图,但是视图如何做到这一点仍然是一般的自由.所以视图模型定义了一个int属性,因为有一个数字; 视图现在可以使用文本框(允许所有这些问题),或使用本机与数字一起使用的东西.所以不,改变属性的类型 …

c# validation wpf mvvm

57
推荐指数
1
解决办法
3万
查看次数

WPF中MVVM的项目结构

在WPF中使用MVVM时,您最终得到的项目结构是什么?

从我现在看到的教程中,他们通常有文件夹:Model,ModelView和View.

在Model中,您可以将Person等类放在捕获数据和逻辑的类中.

在ModelView中,您实例化Model中定义的类.视图包含.xaml文件.

编辑:我编辑我的原始帖子以发送示例项目结构.我有与此有关的问题.我如何组织这些:App.config App.xaml MainWindow.xaml

我应该像现在一样将它们留在外面,还是应该将它们放在某个文件夹中?

在此输入图像描述

c# wpf xaml mvvm

56
推荐指数
2
解决办法
5万
查看次数

56
推荐指数
4
解决办法
5万
查看次数

Angular2:MVC,MVVM还是MV*?

由于其双向数据绑定功能,Angular one或多或少遵循MVV*设计原则.

Angular2正在采用基于组件的UI,这是React开发人员可能熟悉的概念.从某种意义上说,Angular 1.x控制器和指令模糊了新的Angular 2 Component.

这意味着在Angular 2中没有控制器也没有指令.相反,组件有一个选择器,它对应于组件将表示的html标签,而@View则指定要填充的组件的HTML模板.

Angular2仍然实现双向数据绑定,但不包含模型,例如,如果我有一个@Component显示文章列表和一个class定义文章对象的模型:

class Article {
title: string;
link: string;
votes: number;

constructor(title: string, link: string, votes?: number){
    this.title = title;
    this.link = link;
    this.votes = votes || 0;
}
Run Code Online (Sandbox Code Playgroud)

这在MVC模式中将被视为模型.

那么考虑到这个Angular最接近的设计模式呢?

model-view-controller mvvm angular

56
推荐指数
6
解决办法
5万
查看次数