WPF将数据对象从主应用程序UI传递到用户控件

WPF将数据对象从主应用程序UI传递到用户控件,wpf,user-controls,relativesource,Wpf,User Controls,Relativesource,我定义了用户控件来表示选项卡项的内容,以便将大型XAML文件拆分为较小的文件。我希望将对数据对象的引用从主UI类传递到用户控件 我理解依赖性和相对性资源是实现这一点的方法,但由于我缺乏WPF专业知识,我不确定如何实现这一点。有人能帮我吗 谢谢 我有三个xaml文件:MainWindow、AlsTabUC(UserControl)和RangingTabUC(UserControl)。我有一个单独的对象表示一个设备,它可以执行范围光和环境光测量,wojuld希望在单独的选项卡中执行这些活动 对象m_

我定义了用户控件来表示选项卡项的内容,以便将大型XAML文件拆分为较小的文件。我希望将对数据对象的引用从主UI类传递到用户控件

我理解依赖性和相对性资源是实现这一点的方法,但由于我缺乏WPF专业知识,我不确定如何实现这一点。有人能帮我吗

谢谢

我有三个xaml文件:MainWindow、AlsTabUC(UserControl)和RangingTabUC(UserControl)。我有一个单独的对象表示一个设备,它可以执行范围光和环境光测量,wojuld希望在单独的选项卡中执行这些活动

对象m_mySensorDevice是MainWindow的成员,MainWindow是父对象,我希望将此对象传递给两个子对象,以便它们可以执行readAmbientLight和readRange方法

当然,我已经提供了非常基本的示例代码用于说明。实际上,这些选项卡包含更多的信息(以及其他选项卡),因此需要用户控件

主窗口-XAML
    <Window.Resources>
        <System:String x:Key="strTabHeaderRanging">Ranging</System:String>
        <System:String x:Key="strTabHeaderALS">ALS</System:String>
    </Window.Resources>
    <Grid>
        <TabControl Name="MainTab" TabStripPlacement="Top"
                    Margin="0,20,0,10"
                    SelectionChanged="mainTab_SelectionChanged" >
            <TabItem Name="tabItemRanging"
                     Header="{Binding Source={StaticResource strTabHeaderRanging}}">
            <Grid>
                <my:rangingTabUC HorizontalAlignment="Center"
                                 VerticalAlignment="Center"
                                 x:Name="rangingTabUC1"/>
            </Grid>
            </TabItem>
            <TabItem Name="tabItemAls"
                  Header="{Binding Source={StaticResource strTabHeaderALS}}">
                <Grid>
                    <my:AlsTabUC HorizontalAlignment="Center"
                                 VerticalAlignment="Center"
                                 x:Name="alsTabUC1" /> 
                </Grid>
            </TabItem>
        </TabControl>
    </Grid>
</Window>
AlsTabUC-XAML

    <Window.Resources>
        <System:String x:Key="strTabHeaderRanging">Ranging</System:String>
        <System:String x:Key="strTabHeaderALS">ALS</System:String>
    </Window.Resources>
    <Grid>
        <TabControl Name="MainTab" TabStripPlacement="Top"
                    Margin="0,20,0,10"
                    SelectionChanged="mainTab_SelectionChanged" >
            <TabItem Name="tabItemRanging"
                     Header="{Binding Source={StaticResource strTabHeaderRanging}}">
            <Grid>
                <my:rangingTabUC HorizontalAlignment="Center"
                                 VerticalAlignment="Center"
                                 x:Name="rangingTabUC1"/>
            </Grid>
            </TabItem>
            <TabItem Name="tabItemAls"
                  Header="{Binding Source={StaticResource strTabHeaderALS}}">
                <Grid>
                    <my:AlsTabUC HorizontalAlignment="Center"
                                 VerticalAlignment="Center"
                                 x:Name="alsTabUC1" /> 
                </Grid>
            </TabItem>
        </TabControl>
    </Grid>
</Window>
<UserControl x:Class="TabUserControls.AlsTabUC">
    <Grid>
        <Button Height="25" Width="100" Name="readAmbientLight"
                HorizontalAlignment="Center"  VerticalAlignment="Center"
                Click="readAmbientLight_Click" Margin="2">
            Read Amb Light
        </Button>
    </Grid>
</UserControl>
<UserControl x:Class="TabUserControls.rangingTabUC">
    <Grid>
        <Button Height="25" Width="100" Name="readRange"
                HorizontalAlignment="Center"  VerticalAlignment="Center"
                Click="readRange_Click" Margin="2">
            Read Range
        </Button>  
    </Grid>
</UserControl>
排名表-XAML

    <Window.Resources>
        <System:String x:Key="strTabHeaderRanging">Ranging</System:String>
        <System:String x:Key="strTabHeaderALS">ALS</System:String>
    </Window.Resources>
    <Grid>
        <TabControl Name="MainTab" TabStripPlacement="Top"
                    Margin="0,20,0,10"
                    SelectionChanged="mainTab_SelectionChanged" >
            <TabItem Name="tabItemRanging"
                     Header="{Binding Source={StaticResource strTabHeaderRanging}}">
            <Grid>
                <my:rangingTabUC HorizontalAlignment="Center"
                                 VerticalAlignment="Center"
                                 x:Name="rangingTabUC1"/>
            </Grid>
            </TabItem>
            <TabItem Name="tabItemAls"
                  Header="{Binding Source={StaticResource strTabHeaderALS}}">
                <Grid>
                    <my:AlsTabUC HorizontalAlignment="Center"
                                 VerticalAlignment="Center"
                                 x:Name="alsTabUC1" /> 
                </Grid>
            </TabItem>
        </TabControl>
    </Grid>
</Window>
<UserControl x:Class="TabUserControls.AlsTabUC">
    <Grid>
        <Button Height="25" Width="100" Name="readAmbientLight"
                HorizontalAlignment="Center"  VerticalAlignment="Center"
                Click="readAmbientLight_Click" Margin="2">
            Read Amb Light
        </Button>
    </Grid>
</UserControl>
<UserControl x:Class="TabUserControls.rangingTabUC">
    <Grid>
        <Button Height="25" Width="100" Name="readRange"
                HorizontalAlignment="Center"  VerticalAlignment="Center"
                Click="readRange_Click" Margin="2">
            Read Range
        </Button>  
    </Grid>
</UserControl>

由于UserControl是在XAML中定义的,并且由主窗口的code InitializeComponent初始化,因此无法使用构造函数将SensorDevice的引用传递给UserControl

在主窗口中调用
InitializeComponent
后,向用户控件
AlsTabUC
RangTabuc
添加属性
SensorDevice
,以将传感器设备的引用传递给用户控件

public SensorDevice Sensor {
    get;
    set;
}
main窗口的构造函数更改为以下内容

public MainWindow()
{
    m_mySensorDevice = new SensorDevice();
    InitializeComponent();

    // Pass reference of SensorDevice to UserControls
    rangingTabUC1.Sensor = m_mySensorDevice; 
    alsTabUC1.Sensor = m_mySensorDevice;
}
在UserControls中,可以使用属性调用SensorDevice上的方法

SensorDevice.readAmbientLight();


我认为您可以调用SensorDevice的方法来获取环境值或范围值,因此可以定义从INotifyPropertyChanged接口继承的viewmodel类SensorDevice,并定义两个属性,如ambient或range,然后调用OnPropertyChanged(“环境”)。之后,需要在xaml中初始化viewmodel,并将其传递给tabcontrol的DataContext。您的usercontrol仅绑定到环境或范围属性

代码如下:

视图模型

公共类传感器设备:InotifyProperty已更改
{
私有字符串_ambient=string.Empty;
公共字符串环境
{
获取{return\u ambient;}
设置
{
_环境=价值;
不动产变更(“环境”);
}
}
公共事件属性更改事件处理程序属性更改;
受保护的无效OnPropertyChanged(字符串propertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
Xaml-like:



发布相关代码和XAML。此外,WPF中视图之间的层次关系通常表现在ViewModel级别,而不是视图级别。这是一种MVVM视图模型优先的方法,我已经按照要求发布了代码和XAML。谢谢。我看不到这里定义的任何DataContext,所以我只想提供以下建议:您可以在UserControl中使用从MainWindow继承的DataContext,然后像平常一样对其调用方法。谢谢。这正是我想要的。