我正在使用MVVM模式实现WPF应用程序。将viewmodel中的变量绑定到另一个视图模型中的另一个变量
该应用程序基本上是一个通讯面板(通讯面板),其上放置了控件(例如拨号盘,对讲线等)。控件小部件也使用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;
}
}
拨号盘被放置在一个通讯科面板(也使用MVVM实现),该公司在其视图模型DialedPABXNumber公共领域:
public string DialedPABXNumber
{
get { return _dialedPABXNumber; }
set
{
_dialedPABXNumber = value;
OnPropertyChanged("DialedPABXNumber");
}
}
现在,我希望能够给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>
DialedNumber是一个依赖对象吗? – Blachshma
看来你试图直接在你的控件上访问你的ViewModel属性之一“DialPadModel.DialedNumber”,这是不对的。您将需要PanelControls:DialPad上的依赖项属性。在你的文章中不太清楚什么是model/viewModel/view(我可能对widget有不同的语义))。请澄清什么是Model/ViewModel/View :) – Sisyphe
@Blachshma不,它只是视图模型中的一个公共访问器。请注意,我忘记说我在视图的代码隐藏文件中也有一个DialedNumber公共字段,但它只是从视图模型的DialedNumber字段读取/写入。让我编辑我的原始帖子,以便清楚说明。 – Nacho1984