Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将2个密码框作为CommandParameter传递给Command?_C#_Wpf_Mvvm_Multibinding_Passwordbox - Fatal编程技术网

C# 如何将2个密码框作为CommandParameter传递给Command?

C# 如何将2个密码框作为CommandParameter传递给Command?,c#,wpf,mvvm,multibinding,passwordbox,C#,Wpf,Mvvm,Multibinding,Passwordbox,在WPF中,PasswordBox.Password不是DP,所以我们不能直接在ViewModel中绑定它。我已经进行了一次在线搜索,使用此方法,但在加载视图时只调用了一次转换器,因此ExecuteMyCommand中的参数为null: MainWindow.xaml ViewModel\MainViewModel.cs using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using System.Windows.Contro

在WPF中,PasswordBox.Password不是DP,所以我们不能直接在ViewModel中绑定它。我已经进行了一次在线搜索,使用此方法,但在加载视图时只调用了一次转换器,因此ExecuteMyCommand中的参数为null:

MainWindow.xaml

ViewModel\MainViewModel.cs

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System.Windows.Controls;
namespace MVVM_Light_Base.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        private RelayCommand<object> myCommand;

        public RelayCommand<object> MyCommand
        {
            get
            {
                return myCommand ?? (myCommand =
                    new RelayCommand<object>(ExecuteMyCommand));
            }
        }

        private void ExecuteMyCommand(object parameter)
        {
            var pswBoxes = parameter as object[];
            PasswordBox pb;
            string psw0;
            string psw1;

            try
            {
                pb = pswBoxes[0] as PasswordBox;
                psw0 = pb.Password;
                pb = pswBoxes[1] as PasswordBox;
                psw1 = pb.Password;
            }
            catch
            {
                return;
            }
        }
    }
}
使用GalaSoft.MvvmLight;
使用GalaSoft.MvvmLight.Command;
使用System.Windows.Controls;
命名空间MVVM_Light_Base.ViewModel
{
公共类MainViewModel:ViewModelBase
{
私人中继命令;
公共关系命令MyCommand
{
得到
{
返回myCommand???(myCommand=
新RelayCommand(ExecuteMyCommand));
}
}
私有void ExecuteMyCommand(对象参数)
{
var pswBoxes=作为对象的参数[];
密码箱pb;
字符串psw0;
字符串psw1;
尝试
{
pb=pswBoxes[0]作为密码箱;
psw0=pb.密码;
pb=pswBoxes[1]作为密码箱;
psw1=pb.密码;
}
抓住
{
返回;
}
}
}
}


为什么转换器不能正常工作?我该怎么做呢?

事实上,问题出在你的转换器上。您不需要实现MarkupExtension。只是多值转换器

public class PlainMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        return values;
    }

    public object[] ConvertBack(object value, Type[] targetTypes,
        object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
然后在XAML中将转换器声明为资源,并将其用作简单的
{StaticResource MyConverter}

<DockPanel x:Name="WindowLayout" LastChildFill="False">
    <DockPanel.Resources>
        <local:PlainMultiValueConverter x:Key="PlainMultiValueConverter"/>
    </DockPanel.Resources>
<!--...-->
    <Button IsDefault="True" Command="{Binding MyCommand}" DockPanel.Dock="Top" Content="Click" Width="60" Margin="10">
        <Button.CommandParameter>
            <MultiBinding Converter="{StaticResource PlainMultiValueConverter}">
                <Binding ElementName="PswBox"/>
                <Binding ElementName="AgainPswBox"/>
            </MultiBinding>
        </Button.CommandParameter>
    </Button>
</DockPanel>

将数组转换为新列表,而不是从转换器返回数组

转换器

public object Convert(object[] values, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
{
   return values.ToList();
}
命令方法

private void ExecuteMyCommand(object parameter)
{
   var pswBoxes = parameter as List<object>;
   .....
}
private void ExecuteMyCommand(对象参数)
{
var pswBoxes=列表中的参数;
.....
}

非常完美。但我不知道为什么需要“return values.ToList()”?通过直接传递值,实际上就是传递对数组的引用。因此,数组中的任何更改都将反映在整个使用过程中。不确定是哪个操作将对象设置回null(可能是XAML加载中的某些代码)。因此,使用
ToList()
可以创建新的引用,并将其传递给ViewModel,而ViewModel在值数组中的任何更新都不会改变。继承MarkupExtension的PlainMultiValueConverter只实现了singleton模式。
public object Convert(object[] values, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
{
   return values.ToList();
}
private void ExecuteMyCommand(object parameter)
{
   var pswBoxes = parameter as List<object>;
   .....
}