我正在尝试将当前 WinForms 应用程序移植到 WPF ,并需要帮助构建 WPF 类结构。
目前在WinForms中,我有一个基类(带有菜单,工具栏,网格和上下文菜单)和几个继承的类,它们具有不同的数据源和列的网格和菜单,工具栏和上下文菜单的附加按钮。
问题:
为了避免继承,我的usercontrol最好的 WPF 类结构是什么?
我可以将ToolBar移动到 ResourceDictionary (例如 ControlTemplate )吗? 如果按钮将在单独的资源文件中指定,如何添加新按钮或将命令绑定到现有按钮?
还有其他想法吗?
由于 WPF 中的继承限制,我只看到一种避免重复菜单,工具栏等的方法 - 只在没有 XAML 的情况下在C#代码中实现基类。并且我可能也不能将XAML用于继承类(不知道如何在XAML中将新按钮添加到基类中创建的工具栏中)
答案 0 :(得分:2)
在WPF中,Toolbar是一个ItemsControl(与Menu相同),因此它有一个ItemsSource属性,可以绑定到您的工具栏项集合。
<Window.Resources>
<DataTemplate x:Key="ItemTemplate1">
<StackPanel>
<TextBlock Text="{Binding Property1}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid x:Name="LayoutRoot" DataContext="{Binding MyViewModel}">
<ToolBar HorizontalAlignment="Left" VerticalAlignment="Top" ItemTemplate="{DynamicResource ItemTemplate1}" ItemsSource="{Binding ToolbarItems}"/>
</Grid>
在此代码中,ToolbarItems是一个ObservableCollection&lt; MyToolBarItem&gt;,其中MyToolbarItem是一个表示一个工具栏项的viewmodel。
MyToolBarItem可以是基类,有几个类继承自它。然后,您可以使用DataTemplateSelector根据工具栏项的类型使用不同的模板。
通过这种方式,具有工具栏的所有用户控件都可以使用您在字典中定义的相同模板;每个工具栏都绑定到MyToolBarItems的不同集合。
如果其中一些听起来很难,你可以阅读一些MVVM。这是使WPF很棒的设计模式。