我正在使用 MVVM 模式实现 WPF 应用程序。
该应用程序基本上是一个通信面板(comms 面板),上面放置了控制部件(例如,拨号盘、内部通信线路等)。控件小部件也已使用 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 字段链接到 comms 面板中的 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”。
如何在 XAML 中指定我想访问 DialPadViewModel.DialedNumber?
编辑:添加有关组件如何组合在一起的背景信息。应用程序的主窗口有两个子窗口:左侧的控制面板和适当的通讯面板,它是动态加载的。
<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>