如何在 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"方法非常受欢迎,但无论哪种方式都是解决方案!

谢谢你的时间。

如何在 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绑定到这些。