我是WPF的新手,目前正在开发原型。在这个项目中,我使用了contentcontrols和自定义用户控件。
结构基本上是: MainWindow - > MainViews的Ribbon + TabControl
MainView - > ContentView + EditPanel
EditPanel - > DetailInfo + Editor
现在这个编辑器包含一个FrameworkElement,它公开了我想要从功能区绑定到的一些命令,但我无法使绑定工作。 MainView和EditPanel是用户控件。
MainWindow Xaml看起来基本上是这样的:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button Command="{Binding ElementName="MainTabControl", Path=SelectedContent.xxxx }" />
> this gives me the MainViewModel, not the MainView
<Ribbon Grid.Row="0" />
<TabControl Name="MainTabControl"
Grid.Row="1"
ItemsSource="{Binding ListOfMainViewModels}">
<TabControl.ContentTemplate>
<DataTemplate>
<view:MainView DataContext="{Binding Data}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Grid>
MainView.xaml可归结为:
<Grid>
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>
<ContentControl Grid.Column="0"
Content="{Binding CurrentContentView}" />
<ContentControl Grid.Column="1">
<ContentControl.Content>
<View:QuickEditView DataContext="{Binding CurrentViewViewModel.SelectedItem}" />
</ContentControl.Content>
</ContentControl>
</Grid>
最后是QuickEditView,它有一个公开所需命令的编辑器元素:
<Grid>
...
<sccontrols:MemoEditControl />
...
</Grid>
如果我尝试从MainView到编辑器控件的绑定没有问题,但我无法从MainWindow中的功能区开始工作。 在我看来,问题是我无法进入tabcontrol中的MainView。 selecteditem以及selectedcontent是MainViewModel,而不是MainView,我不愿意在viewmodel中保持对视图的引用
有什么建议吗?提前谢谢。
编辑:广泛的MainViewModel
public class MainViewModel : INotifyChanged etc
{
public System.Collections.ObjectModel.ObservableCollection<DisplayStyles> AvailableDisplayStyles {...}
public DisplayStyles SelectedDisplayStyle {...}
public SelectableListViewModelBase<DetailViewModel> CurrentViewViewModel{...}
public System.Windows.Controls.Control CurrentContentView{...}
...
}
MainWindowViewModel只包含MainViewModel列表以及selectedMainviewModel +一串命令
我目前的想法是要通过可视化树来查找正确的元素(我怀疑这里的性能会是一个问题),或者通过依赖属性将元素推向封装控件(噩梦的位置到从长远来看,我想象)