0

我创建了一个自定义控件,该控件在其自己的 XAML 表中进行样式设置和配置。此控件中的数据绑定使用特定对象(CProject 类)。

澄清一下,该控件是一个项目框架,具有设置控件和一个画布,该画布将成为每个/任何项目的工作区。

项目控件 (IPProjectPanel) 继承了“Frame”,并将“设置”堆栈面板添加到其子列表中,该列表又包含用于设置的控件。

然而,CProject 类是纯功能部分,没有任何 UI 交互或处理。因此,我需要将 CProject 的一个实例“插入”到每个可以激活的独特项目中。因此,我想将 CProject 的特定实例设置为 tabpanel 中每个 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>

在这里,它被设置为 Grid 的上下文,但我想将它作为实际类(IPProjectPanel)的上下文。

因此,IPProjectPanel 实例是由代码创建的(现在..),我需要检索 CProject 实例(或设置一个)以便我可以使用它。

我想保持 C#/WPF 做事的方式,因为这个应用程序也在训练 WPF 和 C# 概念等。所以“最好的 C#-WPF”方法是非常受欢迎的,但无论哪种方式都是一种解决方案!

感谢您的时间。

4

2 回答 2

1

所以一般来说,datacontext 主要用于您的 ViewModel,实际上 WPF 确实是为执行 MVVM(模型视图 ViewModel)样式应用程序而设置的。它实际上很容易学习,但是如果您正在寻找“最佳 C#-WPF”的做事方式,请花时间学习 MVVM。这真的很简单。

来自 CodeProject 的简单示例:

http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial

来自微软(有点重读):

http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

于 2013-02-07T14:37:01.027 回答
0

您当前进行此设置的方式可能会产生一些令人讨厌的错误。你永远不应该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到这些。

于 2013-02-07T15:27:57.267 回答