gpt4 book ai didi

c# - MVVM WPF Multibinding 不适用于命令参数

转载 作者:行者123 更新时间:2023-12-03 10:32:13 24 4
gpt4 key购买 nike

我无法使多重绑定(bind)适用于两个密码框。我确实在网上阅读了很多文章尝试工作示例,但没有一个与我尝试过的场景相同。问题是当我点击登录按钮时,这些密码字段不会传输到命令 Execute 方法。

转换器的 XAML:

<Grid.Resources>
<converter:PasswordConverter x:Key="passwordConverter"/>
</Grid.Resources>

按钮的 XAML 如下所示:
<Button x:Name="loginButton" 
Content="Belépés"
Margin="494,430,0,0"
VerticalAlignment="Top"
FontSize="20"
RenderTransformOrigin="-2.624,8.99"
HorizontalAlignment="Left"
Width="172"
Command="{Binding NavCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource passwordConverter}" Mode="TwoWay">
<Binding Path="Password" ElementName="userIDPasswordBox"/>
<Binding Path="Password" ElementName="leaderIDPasswordBox"/>
</MultiBinding>
</Button.CommandParameter>
</Button>

密码转换器代码:
public class PasswordConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Clone();
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

中继命令:
public class RelayCommand : ICommand
{

Action _TargetExecuteMethod;
Func<bool> _TargetCanExecuteMethod;

public RelayCommand(Action executeMethod)
{
_TargetExecuteMethod = executeMethod;
}

public RelayCommand(Action executeMethod, Func<bool> canExecuteMethod)
{
_TargetExecuteMethod = executeMethod;
_TargetCanExecuteMethod = canExecuteMethod;
}

public void RaiseCanExecuteChanged()
{
CanExecuteChanged(this, EventArgs.Empty);
}

#region ICommand Members

bool ICommand.CanExecute(object parameter)
{

if (_TargetCanExecuteMethod != null)
{
return _TargetCanExecuteMethod();
}

if (_TargetExecuteMethod != null)
{
return true;
}

return false;
}

public event EventHandler CanExecuteChanged = delegate { };

void ICommand.Execute(object parameter)
{
if (_TargetExecuteMethod != null)
{
_TargetExecuteMethod();
}
}

#endregion
}

以及 View 模型的最后一段代码:
public class LogonViewModel : BaseViewModel
{

private Action _loginActionComplete;
public LogonViewModel(Action loginActionComplete)
{
_measureTimer = new Timer();
_measureTimer.Interval = 500D;
_measureTimer.Elapsed += measureTimer_Elapsed;
_measureTimer.Start();
_loginActionComplete = loginActionComplete;
NavCommand = new RelayCommand(loginActionComplete);
SerialPort = new SerailCommunicationNameSpace.SerialCommunication("COM3");
}

~LogonViewModel()
{
SerialPort.Close();
}

public RelayCommand NavCommand { get; private set; }

private double _measuredWeight;
public double MeasuredWeight {
get
{
return _measuredWeight;
}
set
{
SetProperty(ref _measuredWeight, value);
}
}
private Timer _measureTimer;
public SerailCommunicationNameSpace.SerialCommunication SerialPort { get; set; }

private void measureTimer_Elapsed(object sender, ElapsedEventArgs e)
{
var measuredWeight = 0D;
if (string.IsNullOrWhiteSpace(SerialPort.DataReceived) == false) {
var dataReceivedStartTrim = SerialPort.DataReceived.TrimStart();
var dataReceivedNumbersOnly = dataReceivedStartTrim.Substring(0, dataReceivedStartTrim.IndexOf(' '));
var enUSCultureInfo = new CultureInfo("en-US");
measuredWeight = double.Parse(dataReceivedNumbersOnly, enUSCultureInfo);
}
SetProperty(ref _measuredWeight, measuredWeight);
OnPropertyChanged("MeasuredWeight");
}

public string LeaderId { get; set; }

public string UserId { get; set; }

}

最佳答案

问题是 Password PasswordBox 的属性(property)既不是依赖属性也不是实现 INotifyPropertyChanged .这意味着,密码的更改将不会应用于绑定(bind)。
例如。如果为 PasswordChanged 添加事件处理程序到PasswordBox并将密码设置为Tag属性,则可以绑定(bind)到 Tag并且绑定(bind)将起作用。

<Button x:Name="loginButton" 
Content="Belépés"
Margin="494,430,0,0"
VerticalAlignment="Top"
FontSize="20"
RenderTransformOrigin="-2.624,8.99"
HorizontalAlignment="Left"
Width="172"
Command="{Binding NavCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource passwordConverter}">
<Binding Path="Tag" ElementName="userIDPasswordBox"/>
<Binding Path="Tag" ElementName="leaderIDPasswordBox"/>
</MultiBinding>
</Button.CommandParameter>
</Button>

<PasswordBox Name="userIDPasswordBox" PasswordChanged="PasswordBox_PasswordChanged"/>
<PasswordBox Name="leaderIDPasswordBox" PasswordChanged="PasswordBox_PasswordChanged"/>

private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
var pbx = sender as PasswordBox;
if (pbx!=null)
{
pbx.Tag = pbx.Password;
}
}

当然,为了避免实现背后的代码,您应该将事件处理程序移至行为。

关于c# - MVVM WPF Multibinding 不适用于命令参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54090474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com