MVVM パターンを使用して WPF アプリケーションを実装しています。
このアプリケーションは、基本的に、コントロール ウィジェット (ダイヤル パッド、インターコム回線など) が上に配置された通信パネル (通信パネル) です。コントロール ウィジェットも MVVM パターンを使用して実装されています。これにより、個別に簡単にテストできるようになります。
ビュー モデルで DialedNumber パブリック フィールドを公開する、この「ダイヤル パッド」コントロール ウィジェットがあります。
public string DialedNumber
{
get { return _dialPadModel.DialedNumber; }
set
{
_dialPadModel.DialedNumber = value;
RaisePropertyChanged("DialedNumber");
}
}
「ダイヤル パッド」コントロール ウィジェットは、ビューのパブリック フィールドを介してそのビュー モデルも公開します。
public DialPadViewModel DialPadViewModel
{
get { return DataContext as DialPadViewModel; }
}
また、ビューモデルのパブリックフィールドから書き込み/読み取りを行うビューを介して公開します。
public string DialedNumber
{
get
{
return DialPadViewModel.DialedNumber;
}
set
{
DialPadViewModel.DialedNumber = value;
}
}
DialPad は通信パネル (これも MVVM を使用して実装) に配置され、ビュー モデルに DialedPABXNumber パブリック フィールドがあります。
public string DialedPABXNumber
{
get { return _dialedPABXNumber; }
set
{
_dialedPABXNumber = value;
OnPropertyChanged("DialedPABXNumber");
}
}
ここで、DialPad の DialedNumber フィールドを通信パネルの DialedPABXNumber フィールドにリンクできるようにしたいと考えています。ただし、それを行うために適切な XAML 構文を考え出すのに苦労しています。私のアプローチは次のようになります。
<PanelControls:DialPad x:Name="MyDialPad2" DialPadViewModel.DialedNumber="{Binding Path=CommsPanelViewModel.DialedPABXNumber, Mode=OneWayToSource}"/>
これにより、通信パネルの XAML が読み込まれるときに実行時例外が発生します。すなわち:
不明なメンバー '{http://schemas.microsoft.com/winfx/2006/xaml/presentation}DialPadModel.DialedNumber' を設定できません。
DialPadViewModel.DialedNumber にアクセスしたい XAML で指定するにはどうすればよいですか?
編集:コンポーネントがどのように組み合わされるかについて、この背景情報を追加します。アプリケーションのメイン ウィンドウには 2 つのサブウィンドウがあります。左側のコントロール パネルと、動的に読み込まれる適切な通信パネルです。
<Window x:Class="Comms.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Views="clr-namespace:Comms.View"
xmlns:ViewModel="clr-namespace:Comms.ViewModel"
Title="Comms" Height="350" Width="525" Closing="WindowClosing">
<Window.Resources>
<DataTemplate x:Name="CommsControlPanelViewModel" DataType="{x:Type ViewModel:CommsControlPanelViewModel}">
<Views:CommsControlPanelView x:Name="CommsControlPanelView"/>
</DataTemplate>
<DataTemplate x:Name="CommsPanelViewModel" DataType="{x:Type ViewModel:CommsPanelViewModel}">
<Views:CommsPanelView x:Name="CommsPanelView"/>
</DataTemplate>
</Window.Resources>
<StackPanel x:Name="Layout" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Orientation="Horizontal">
<ContentControl Content="{Binding CommsControlPanelView}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<ContentControl Content="{Binding CommsPanelView}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</StackPanel>
通信パネルは動的に読み込まれます。パネルの XAML ファイルは次のとおりです。
<Border x:Name="CommsPanelBorder"
Style="{DynamicResource BorderTemplate}"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PanelControls="clr-namespace:CommsPanelControlsLib.View;assembly=CommsPanelControlsLib"
VerticalAlignment="Top">
<StackPanel>
<!-- PABX Dial Pad -->
<StackPanel Orientation="Horizontal">
<PanelControls:DialPad x:Name="MyDialPad2" DialPadViewModel.DialedNumber="{Binding Path=CommsPanelViewModel.DialedPABXNumber, Mode=OneWayToSource}"/>
</StackPanel>
</StackPanel>