3

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

我知道 DependancyProperties 和 RelativeSource 是实现这一目标的方法,但由于我缺乏 WPF 专业知识,我不确定如何实现这一目标。有人能帮我吗。

谢谢

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

对象 m_mySensorDevice 是 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>

主窗口 - 代码

public partial class MainWindow : Window
{
    SensorDevice m_mySensorDevice;
    public MainWindow()
    {
        m_mySensorDevice = new SensorDevice();
        InitializeComponent();
    }
    private void mainTab_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

    }
}

public class SensorDevice
{
}

AlsTabUC - XAML

<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>

AlsTabUC - 代码

public partial class AlsTabUC : UserControl
{
    public AlsTabUC()
    {
        InitializeComponent();
    }

    private void readAmbientLight_Click(object sender, RoutedEventArgs e)
    {
        m_mySensorDevice.readAmbientLight();
    }
}

测距表UC-XAML

<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>

测距表UC-代码

public partial class rangingTabUC : UserControl
{
    public rangingTabUC()
    {
        InitializeComponent();
    }

    private void readRange_Click(object sender, RoutedEventArgs e)
    {
        m_mySensorDevice.readRange();
    }
}
4

2 回答 2

2

由于 UserControl 在 XAML 中定义并由 MainWindow 的代码 InitializeComponent 初始化,因此您无法使用构造函数将 SensorDevice 的引用传递给 UserControl。

在您的 MainWindow 中调用后,SensorDevice向您的 UserControls添加一个属性AlsTabUC并将rangingTabUC 您的 SensorDevice 的引用传递给您的 UserControls 。InitializeComponent

public SensorDevice Sensor {
    get;
    set;
}

将您的构造函数更改为MainWindow以下

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.readRange();
于 2013-06-12T07:27:42.063 回答
1

我认为您调用 SensorDevice 的方法来获取环境或范围值,因此您可以定义从 INotifyPropertyChanged 接口继承的视图模型类 SensorDevice,并定义两个属性,如 Ambient 或 Range,并调用 OnPropertyChanged("Ambient")。之后,您需要在 xaml 中初始化您的视图模型,并将其传递给 tabcontrol 的 DataContext。您的用户控件只是绑定到 Ambient 或 Range 属性。

像这样的代码:

视图模型

public class SensorDevice : INotifyPropertyChanged
{
    private string _ambient = string.Empty;

    public string Ambient
    {
        get {return _ambient;}
        set 
        {
            _ambient = value;
            OnPropertyChanged("Ambient");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Xaml 喜欢:

<Window.Resources>
    <your_namespace_name:SensorDevice x:Key="DeviceVM" />
</Window.Resources>

<TabControl DataContext="{Binding Source={StaticResource DeviceVM}}">
    <TabItem Name="tabItemRanging"
             Header="{Binding Source={StaticResource strTabHeaderRanging}}">
        <TextBlock Text="{Binding Path=Ambient}" />
    </TabItem>
</TabControl>
于 2013-06-13T05:41:22.113 回答