WPF将选项卡项目表示为UserControls - 共享数据

时间:2013-05-29 23:15:41

标签: wpf custom-controls

我有一个WPF应用程序,其中包含大量包含按钮和文本控件的选项卡项。为了减小XAML文件的大小,我想用用户控件来表示选项卡内容。按钮点击引起的控制操作访问相同的数据,因此我想知道如何在这些用户控件之间共享数据。

为了进一步说明,我的应用程序正在控制设备,并且标签根据各种操作模式执行各种操作。例如tab1有按钮初始化和运行,调用myDevice.initialise()和myDevice.run()。 Tab2处理校准,因此调用myDevice.calibrate()等。

目前我在主应用程序中创建了myDevice对象,因此想知道如何与为每个选项卡定义的自定义控件共享它,以便按钮单击回调可以访问myDevice。

提前致谢。

3 个答案:

答案 0 :(得分:1)

我建议在List<IOperationMode> OperationsModes中保留myDevide列表,然后为每种操作模式创建一组类:

class OperationModeInitialise : IOperationMode
{
}

class OperationModeCalibrate : IOperationMode
{
}

....

并为您在DataTemplate中创建TabControl.Resources资源的每种类型:

<DataTemplate DataType="{x:Type my:OperationModeInitialise}">
   <my:OperationModeInitialiseControl/>
</DataTemplate>

<DataTemplate DataType="{x:Type OperationModeCalibrate}">
   <my:OperationModeCalibrateControl/>
</DataTemplate>

....

myDevice.OperationsModes绑定到TabControl.ItemsSource,并且每个共享一个设备的操作模式都有一个标签。

答案 1 :(得分:0)

您可以在App.vb / App.cs文件中添加对myDevice的引用,并将其设置为公共属性。这样做是一种hackish方式,但应该可以正常工作。

答案 2 :(得分:0)

最简单的方法可能是在DependencyProperty上创建UserControl,以便您可以传递myDevice,或使用RelativeSource绑定设置DataContext所有标签项都有1}}到myDevice

您选择哪种方式取决于数据层的组织方式以及UserControls

中您需要的其他数据

以下是一个快速示例,说明如何将myDevice属性设置为TabItem的DataContext

<TabControl.ItemContainerStyle>
    <Style TargetType="{x:Type TabItem}">
        <Setter Property="DataContext" 
                Value="{Binding Path=DataContext.MyDevice, 
                    RelativeSource={RelativeSource {x:Type TabControl}}}" />
    </Style>
</TabControl>