如何在 wpf 中获取自定义对象作为数据上下文实例或将其设置为自定义控件
本文关键字:实例 上下文 数据 自定义控件 设置 wpf 获取 对象 自定义 | 更新日期: 2023-09-27 17:58:05
我创建了一个自定义控件,该控件在其自己的 XAML 工作表中设置样式和配置。此控件中的数据绑定使用特定对象(CProject 类(。
澄清一下,该控件是一个项目框架,其中包含用于设置的控件和一个画布,该画布将成为每个/任何项目的工作区。
项目控件(IPProjectPanel(继承了"框架",并且还向其子列表添加了一个"设置"堆栈面板,该子列表又包含用于设置的控件。
然而,CProject 类是纯功能部分,没有任何 UI 交互或处理。因此,我需要将CProject的实例"插入"到每个可以激活的独特项目中。因此,我想将CProject的特定实例设置为选项卡面板中每个IPProjectPanel实例的数据上下文。我想通过代码设置数据上下文,或者通过 XAML 中的设置数据上下文创建它,并在初始化后检索它。
但问题是,我也不太清楚。
下面是 XAML 中 IPProjectPanel 样式的一个片段,它使用该方法在 XAML 中设置数据上下文:
<Style TargetType="{x:Type ip:IPProjectGrid}">
<Setter Property="OverridesDefaultStyle"
Value="True" />
<Setter Property="SnapsToDevicePixels"
Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ip:IPProjectGrid}">
<Grid Background="White"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Margin="0">
<!---->
<Grid.DataContext>
<ipp:CProject></ipp:CProject>
</Grid.DataContext>
<StackPanel x:Name="PART_settingsPanel"
HorizontalAlignment="Right"
VerticalAlignment="Stretch"
MinWidth="300" Background="Gray">
<GroupBox Header="Project settings">
<StackPanel>
....
</style>
在这里,它被设置为网格的上下文,但我希望将其作为实际类(IPProjectPanel(的上下文。
因此,IPProjectPanel 实例是通过代码创建的(目前..(,我需要检索 CProject 实例(或设置一个(,以便我可以使用它。
我想保持 C#/WPF 的方式来做事,因为这个应用程序也在训练 WPF 和 C# 概念等。因此,"最佳 C#-WPF"方法非常受欢迎,但无论哪种方式都是解决方案!
谢谢你的时间。
因此,一般来说,数据上下文的主要目的是用于您的 ViewModel,事实上,WPF 实际上是为执行 MVVM(模型视图视图模型(样式的应用程序而设置的。它实际上相当容易学习,但如果您正在寻找"最佳 C#-WPF"的做事方式,请花时间学习 MVVM。这真的相当简单。
来自代码项目的简单示例:
http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial
从Microsoft(阅读有些沉重(:
http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40(.aspx
您目前进行此设置的方式可能会产生一些令人讨厌的错误。切勿在模板中声明DataContext
对象实例,除非您从未计划在该模板范围之外访问它。通过这样做,您将在需要直观地重新加载控件(如更改选项卡(时创建 CProject
类的新实例,并且您最终可能会在代码中引用旧的CProject
实例,同时在屏幕上显示一个完全独立的实例。声明不在模板中的DataContext
对象(即 Window.DataContext
(很好。
如果希望每个控件实例创建自己的CProject
实例,最好在构造函数的代码中执行此操作,并将其公开为控件上的属性,然后可以将Grid.DataContext
绑定到模板内部。避免将其设置为控件本身的 DataContext
属性,因为这将导致在 XAML 中声明它的控件上设置的任何隐式源绑定通过重写继承的DataContext
而中断:
Grid.DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PropertyWithCProject}"
您可能更有可能希望在外部控制CProject
实例并将其交给控制实例。为此,您可以在容器 ViewModel 类(MVVM 模式(中创建它们,并将其设置为包含所有自定义控件的更高DataContext
。然后,可以公开单个CProjects
或它们的集合,并将控件的DataContexts
绑定到这些。