从WPF UserControl获取硬编码参数以进行代码隐藏

本文关键字:代码 隐藏 参数 编码 WPF UserControl 获取 | 更新日期: 2023-09-27 17:59:23

我正在尝试做一些非常简单的事情:我有一个UserControl,我想在其中传递一个简单的字符串参数。

WPF消息页面.xaml

<Page
    x:Class="MuchroomPhone.MessagePage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MuchroomPhone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
//...
<PivotItem Header="Nouveaux">
                <local:MessageUC MessType="new"/>
        </PivotItem>
        <PivotItem Header="Lus" >
            <local:MessageUC MessType="read"/>
        </PivotItem>
        <PivotItem Header="Envoyés" >
            <local:MessageUC MessType="send"/>
        </PivotItem>
        <PivotItem Header="Tous" >
            <local:MessageUC MessType="all"/>
        </PivotItem>
//...

我想从MessageUC的代码后面获得MessType。

例如:我想在MessageUC.xaml.cs 中获得字符串"new"

到目前为止,我已经尝试过了:

MessageUC.xaml

<UserControl
    x:Class="MuchroomPhone.MessageUC"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MuchroomPhone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">
//I don't think the content of the UC is important for my issue, but if you wanted to I can give it too.

MessageUC.xaml.cs

 public sealed partial class MessageUC : UserControl
    {
        public string _messType;
        public string MessType
        {
           get{ return _messType;}
           set{this._messType = value;}
        }
        public ObservableCollection<Message> listMessages { get; set; }
        public MessageUC()
        {
            this.InitializeComponent();
            Debug.WriteLine(MessType);
            this.fetchUserData();           
        }

但是MessType字符串为空。。。有什么想法可以实现吗?

附言:我认为应该有一种不那么冗长的方法来做到这一点,所以如果你知道一个"简单"的技巧,那就太好了!感谢

编辑:所以如果我使用一个简单的属性,它应该有效吗?因为我在MessType上仍然有null。。。

我也尝试过使用依赖属性,MessType是一个空字符串。

第二版:我想我明白错在哪里了。事实上,MessageUC.xaml上不存在MessType。所以后面的代码找不到它。也许可以直接将变量传递给我的Page MessagePage.xaml到User Control MessageUC吗?

从WPF UserControl获取硬编码参数以进行代码隐藏

您只需要将fetchUserData移动到已加载的事件:

public sealed partial class MessageUC : UserControl
{
    public string MessType { get; set; }
    public MessageUC()
    {
        InitializeComponent();
        Debug.Writeline(MessType); //null
        Loaded += MessageUC_Loaded;
    }
    public void MessageUC_Loaded(object sender, EventArgs e)
    {
        Debug.Writeline(MessType); //new
        this.fetchUserData();
    }
}

不需要DependencyProperty!您的原始代码不起作用,因为在设置属性之前调用了ctor。DependencyProperty并不能解决这个问题,但它支持属性的数据绑定、样式设置和动画设置。

如果你想数据绑定到DependencyProperty,你只需要它。在你的情况下,你可以使用一个普通的属性。

这是应该工作的一组指令。但是,您没有显示控件的定义,因此下面的代码可能需要一些修改和调整。

因此,从注册依赖属性开始:

public static readonly DependencyProperty _messTypeProperty =
    DependencyProperty.Register("_messType", typeof(String),
    typeof(MessageUC), new FrameworkPropertyMetadata(string.Empty));
public String _messType
{
    get { return GetValue(_messTypeProperty).ToString(); }
    set { SetValue(_messTypeProperty, value); }
}

在XAML中为控件添加名称:

<UserrControl x:Class="myNamespace.MessageUC"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    x:Name="MyUserControl">

在MessageUC控件的XAML定义中,在实现MessType的代码中,将其绑定到代码后面的属性。使用您添加到控件定义中的名称指向您的控件:

MessType="{Binding Path=_messType, ElementName=MyUserControl}"