WPF将数据对象从主应用程序UI传递到用户控件
我定义了用户控件来表示选项卡项的内容,以便将大型XAML文件拆分为较小的文件。我希望将对数据对象的引用从主UI类传递到用户控件 我理解依赖性和相对性资源是实现这一点的方法,但由于我缺乏WPF专业知识,我不确定如何实现这一点。有人能帮我吗 谢谢 我有三个xaml文件:MainWindow、AlsTabUC(UserControl)和RangingTabUC(UserControl)。我有一个单独的对象表示一个设备,它可以执行范围光和环境光测量,wojuld希望在单独的选项卡中执行这些活动 对象m_mySensorDevice是MainWindow的成员,MainWindow是父对象,我希望将此对象传递给两个子对象,以便它们可以执行readAmbientLight和readRange方法 当然,我已经提供了非常基本的示例代码用于说明。实际上,这些选项卡包含更多的信息(以及其他选项卡),因此需要用户控件 主窗口-XAMLWPF将数据对象从主应用程序UI传递到用户控件,wpf,user-controls,relativesource,Wpf,User Controls,Relativesource,我定义了用户控件来表示选项卡项的内容,以便将大型XAML文件拆分为较小的文件。我希望将对数据对象的引用从主UI类传递到用户控件 我理解依赖性和相对性资源是实现这一点的方法,但由于我缺乏WPF专业知识,我不确定如何实现这一点。有人能帮我吗 谢谢 我有三个xaml文件:MainWindow、AlsTabUC(UserControl)和RangingTabUC(UserControl)。我有一个单独的对象表示一个设备,它可以执行范围光和环境光测量,wojuld希望在单独的选项卡中执行这些活动 对象m_
<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,然后像平常一样对其调用方法。谢谢。这正是我想要的。