我无法使多重绑定适用于两个密码箱。我确实在网上阅读了很多尝试过的工作示例文章,但是没有一个是我尝试过的相同场景。问题是当我按下登录按钮时,这些密码字段未传输到命令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
}
以及视图模型的最后一大段代码:
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; }
}
答案 0 :(得分:0)
问题在于Password
的{{1}}属性既不是依赖项属性,也不是实现PasswordBox
的属性。这意味着密码更改将不会应用于绑定。
例如。如果将INotifyPropertyChanged
的事件处理程序添加到PasswordChanged
并将密码设置为PasswordBox
属性,则可以绑定到Tag
,绑定将起作用。 / p>
Tag
当然,要避免实现背后的代码,应将事件处理程序移至行为。