WPF でのデータ バインディングに問題があります。シナリオは次のとおりです。ダイヤル パッドをシミュレートするユーザー コントロールを作成しました (つまり、'0' から '9' までの数字と '#' および 'Clear' キーを含む 12 個のボタンの配列)。コントロールはクラス ライブラリ内に存在し、MVVM パターンに従って実装されています。これは主に、クラス ライブラリ内のコンポーネントを簡単に単体テストする必要があるためです。
コントロールのビュー モデルは非常に単純です。基本的には、ユーザーがダイヤル パッドのキー ボタンを押すたびに、公開されている "DialedNumber" 文字列 (モデルに内部的に接続されています) を更新します。バインドは正しく機能しており、デバッガーを使用して、ダイヤル パッドのボタンを押すとビューモデル内の "DialedNumber" 変数が更新されていることを確認できます。
この DialPad コントロールは、別の XAML ファイル (Panel.xaml) で使用され、カスタム クラス ライブラリに属する複数のコントロールが配置されています。
ここで、DialPad 内に保持されている「DialedNumber」文字列を表示するために、Panel ファイル内に TextBlock を追加したいと考えています。これは、Panel.xaml のコード スニペットです。
<PanelControls:DialPad x:Name="MyDialPad" DialedNumber="55325"/>
<TextBlock Text="{Binding ElementName=MyDialPad, Path=DialedNumber}" />
私が得ている結果は、テキストブロックが開始時に正しい番号 (つまり、「55325」) を表示することですが、ダイヤルパッドのキーを押してもその内容は更新されません (DialPad のビューモデルは押したときに更新されますが)。デバッガーで確認したように、新しいキー)。
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 内にブレークポイントを配置し、ダイヤル パッドのキーを押すたびにメソッドが実行されることを確認できます。