相关疑难解决方法(0)

使用MVVM处理WPF中的对话框

在WPF的MVVM模式中,处理对话框是更复杂的操作之一.由于您的视图模型对视图一无所知,因此对话通信很有趣.我可以公开一个ICommand,当视图调用它时,会出现一个对话框.

有没有人知道处理对话结果的好方法?我说的是关于Windows对话框,比如MessageBox.

我们这样做的方法之一是在viewmodel上有一个事件,当需要对话框时,视图会订阅该事件.

public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;
Run Code Online (Sandbox Code Playgroud)

这没关系,但这意味着视图需要代码,这是我想远离的东西.

.net wpf design-patterns dialog mvvm

232
推荐指数
8
解决办法
11万
查看次数

WPF OpenFileDialog与MVVM模式?

我刚开始学习WPF的MVVM模式.我碰壁了:当你需要展示一个OpenFileDialog时你会怎么做

这是我尝试使用它的示例UI:

替代文字

单击"浏览"按钮时,应显示OpenFileDialog.当用户从OpenFileDialog中选择文件时,文件路径应显示在文本框中.

我怎么能用MVVM做到这一点?

更新:如何使用MVVM实现此功能并使其可以进行单元测试?以下解决方案不适用于单元测试.

wpf openfiledialog mvvm

95
推荐指数
2
解决办法
6万
查看次数

在WPF MVVM中打开对话框

我有一个应用程序,需要从用户输入一些信息的按钮打开一个对话框.

目前我这样做(工作正常)

  • 单击按钮会在ViewModel中生成一个命令.
  • ViewModel引发Controller监听的事件.
  • Controller计算出新窗口的细节(即View,ViewModel和model)并打开它(ShowDialog)
  • 当窗口关闭时,Controller将结果添加到eventargs并返回ViewModel
  • ViewModel将信息传递给Model.

有很多步骤,但它们都有意义,并没有太多的打字.

代码看起来像这样(窗口要求输入用户名)

视图模型:

AskUserNameCommand = DelegateCommand(AskUserNameExecute);
...

public event EventHandler<AskUserEventArgs> AskUserName;

void AskUserNameExecute(object arg) {
    var e = new AskUserNameEventArgs();
    AskUserName(this, e);
    mModel.SetUserName(e.UserName);
}
Run Code Online (Sandbox Code Playgroud)

控制器:

mViewModel.AskUserName += (sender,e) => {
    var view = container.Resolve<IAskUserNameView>();
    var model = container.Resolve<IAskUserNameModel>();
    var viewmodel = container.Resolve<IAskUserNameViewModel>(view, model);
    if (dlg.ShowDialog() ?? false)
        e.UserName = model.UserName;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是水平通信如何在MVVM模式中工作.不知何故,让控制器参与模型之间的数据传输似乎是错误的.

我已经查看了中介模式,让模型直接进行通信.不喜欢这个想法,因为它使模型取决于GUI的实现细节.(即如果用文本框替换对话框,模型需要更改)

wpf dialog mvvm

13
推荐指数
2
解决办法
3万
查看次数

如何添加验证以查看模型属性或如何实现 INotifyDataErrorInfo

我有一个 ObservableCollection 类型的数据集合(比如 myClassTypes 实例)。在一些用户操作之后,这个 myClassTypes 填充了 ViewModel 中的值。在视图中,有一个文本框,用户可以在其中输入文本。我需要根据 myClassTypes 值验证文本框数据。因此,如果 myClassTypes 包含用户在文本框中插入的文本,则验证通过,否则将失败。我的代码片段是:ViewModel:

public ObservableCollection < MyClassType > ViewModelClassTypes {
    get {

        return _myClassTypes;
    }
    set {
        _myClassTypes = value;
        NotifyOfPropertyChange(() = >MyClassTypes);
    }
}

public class TestValidationRule: ValidationRule {
    public ObservableCollection < MyClassType > MyClassTypes {
        get = >(ObservableCollection < MyClassType > ) GetValue(MyClassTypesProperty);
        set = >SetValue(MyClassTypesProperty, value);
    }
}
Run Code Online (Sandbox Code Playgroud)

仅供参考:MyClassTypesProperty 是一个依赖属性

我的 View.xaml 是:

<TextBox>
    <TextBox.Text>
        <Binding UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <validationRules:TestValidationRule MyClassTypes="{Binding ViewModelClassTypes}"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)

我无法在 MyClassTypes …

validation wpf mvvm viewmodel inotifydataerrorinfo

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

在 C# 中使用 MVVM(模型-视图-视图模型)的 WPF OpenFileDialog

如何在 c# 中使用 MVVM (Model-View-ViewModel) 编写 WPF OpenFileDialog?我访问了一些关于这个 OpenFileDialog 的网站,但我没有清楚地了解它。这是我的代码

View.xaml 中

<Window....  xmlns:VM="clr-namespace:myproject.myViewModel"
  ...  >
<Window.DataContext><VM:myViewModel/>

</Window.DataContext>
 <ItemsControl ItemsSource="{Binding mygroup}" >
        <ItemsControl.ItemTemplate >
        <DataTemplate>

                 <Grid >....

                       <TextBlock Text="Color"  Margin="20" VerticalAlignment="Center"/>
                        <ComboBox   KeyboardNavigation.TabIndex="0" Grid.Column="1" Margin="45,10,10,10" Height="30" Width="200" ItemsSource="{Binding Color}"   />
                        <TextBlock Text="Shapes" Grid.Row="1"  VerticalAlignment="Center"  />

                        <ComboBox KeyboardNavigation.TabIndex="3" Grid.Column="1" Grid.Row="1" Height="20" Width="150" SelectedIndex="0"   HorizontalContentAlignment="Right" 
                      VerticalAlignment="Center"  ItemsSource="{Binding Shapes}">
                                                            </ComboBox>

<TextBlock Text="Open Files "  VerticalAlignment="Center"      Grid.Row="0"  Grid.Column="2" Margin="10"    />
                                <TextBox  Grid.Column="3" Text="" Height="30" Grid.Row="0"   IsReadOnly="True" 
                        TextAlignment="Right" VerticalContentAlignment="Center" Width="200" />                                    <Button  Grid.Column="4" …
Run Code Online (Sandbox Code Playgroud)

c# wpf mvvm

2
推荐指数
1
解决办法
2467
查看次数