我正在关注MVVM模式。我想将控件的属性值传递给相同控件的“CommandParameter”属性。但是将遇到“对象引用未设置为对象实例的实例”的运行时异常。

WPF:

 <Button
            x:Name="btnBrowseFirmware1"
            Grid.Row="2"
            Grid.Column="1"
            Width="135"
            Height="35"
            Command="{Binding OpenFileDialogCommand}"
            CommandParameter="{Binding  Name ,ElementName=btnBrowseFirmware1}"
            Content="Browse "
            Foreground="White"
             />

View 模型:
  public class ConfigurationParametersViewModel : WorkspaceViewModelBase
{
    public ICommand OpenFileDialogCommand { get; private set; }

    public ConfigurationParametersViewModel()
        : base("ConfigurationParameters", true)
    {
        OpenFileDialogCommand = new RelayCommand<string>(OpenFileDialogCommandFunc);
    }

    private void OpenFileDialogCommandFunc(string browseButtonName)
    {
        OpenFileDialog fileDialog = new OpenFileDialog();
        Some Code...
    }
}

最佳答案

在更改对CommandParameter="{Binding Name ,RelativeSource={RelativeSource Self}}"的绑定(bind)(如B先生建议)将解决您的问题时,我建议不要将UI元素名称发送到ViewModel。这将“破坏” MVVM模式。对每个“打开文件操作”执行命令。这还将避免长if(browserButtonName= "thisOrThat")子句,该子句很难维护。这也具有更多优点。仅举一个例子:您可以将此命令绑定(bind)到KeyBindings。例如,CTRL + O将调用OpenFileCommand。

如果您想追求卓越,甚至可以使用服务来抽象您的OpenFileDialog WPF OpenFileDialog with the MVVM pattern?

关于c# - 如何在WPF中将控件的属性值传递给同一控件的 “CommandParameter”属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40128336/

10-13 03:18