我在 WPF 中的数据绑定方面遇到了一些问题。下面是场景:我制作了一个模拟拨号盘的用户控件(即,一个由 12 个按钮组成的数组,数字从“0”到“9”加上“#”和“清除”键)。该控件位于类库中,它是按照 MVVM 模式实现的,主要是因为我需要类库中的组件易于进行单元测试。
控件的视图模型非常简单,每次用户按下拨号盘按键时,它基本上都会更新一个公共的“DialedNumber”字符串(内部连接到模型)。绑定工作正常,通过使用调试器,我可以确认视图模型中的“DialedNumber”变量正在更新,因为我按下拨号盘中的按钮。
这个 DialPad 控件由一个单独的 XAML 文件 (Panel.xaml) 使用,该文件列出了属于我的自定义类库的几个控件。
现在,我想在 Panel 文件中添加一个 TextBlock,以显示 DialPad 中保存的“DialedNumber”字符串。这是 Panel.xaml 中的代码片段:
<PanelControls:DialPad x:Name="MyDialPad" DialedNumber="55325"/>
<TextBlock Text="{Binding ElementName=MyDialPad, Path=DialedNumber}" />
我得到的结果是文本块在开始时显示正确的数字(即“55325”),但是当我按下拨号盘键时它的内容没有得到更新(即使拨号盘的视图模型在我按下时得到更新)新键,正如我用调试器检查过的那样)。
下面是 DialPad 视图的代码:
public partial class DialPad : UserControl
{
public DialPad()
{
InitializeComponent();
DataContext = new DialPadViewModel();
}
public void DialedNumberChanged(object sender, EventArgs e)
{
return;
}
public DialPadViewModel DialPadViewModel
{
get { return DataContext as DialPadViewModel; }
}
public string DialedNumber
{
get
{
var dialPadViewModel = Resources["DialPadVM"] as DialPadViewModel;
return (dialPadViewModel != null) ? dialPadViewModel.DialedNumber : "";
}
set
{
var dialPadViewModel = Resources["DialPadVM"] as DialPadViewModel;
if (dialPadViewModel != null)
{
dialPadViewModel.DialedNumber = value;
}
}
}
}
这是 DialPad 视图模型:
public class DialPadViewModel : ObservableObject
{
public DialPadViewModel()
{
_dialPadModel = new DialPadModel();
}
#region Fields
private readonly DialPadModel _dialPadModel;
private ICommand _dialPadKeyPressed;
#endregion
#region Public Properties/Command
public DialPadModel DialPadModel
{
get { return _dialPadModel; }
}
public ICommand DialPadKeyPressedCommand
{
get
{
if (_dialPadKeyPressed == null)
{
_dialPadKeyPressed = new RelayCommand(DialPadKeyPressedCmd);
}
return _dialPadKeyPressed;
}
}
public string DialedNumber
{
get { return _dialPadModel.DialedNumber; }
set
{
_dialPadModel.DialedNumber = value;
RaisePropertyChanged("DialedNumber");
}
}
#endregion
#region Private Helpers
private void DialPadKeyPressedCmd(object parameter)
{
string keyPressedString = parameter.ToString();
if (keyPressedString.Length > 0)
{
if (char.IsDigit(keyPressedString[0]))
{
DialedNumber += keyPressedString[0].ToString(CultureInfo.InvariantCulture);
}
else if (keyPressedString == "C" || keyPressedString == "Clr" || keyPressedString == "Clear")
{
DialedNumber = "";
}
}
}
#endregion
}
让我重申一下我的问题:Panel.xaml 中的文本块在开始时显示正确的数字 (55325),但当我按下 DialPadButtons 时它的值永远不会更新。我在 DialPadKeyPressedCmd 中放置了一个断点,我可以确认每次按下拨号盘中的键时都会执行该方法。