从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吗?
您只需要将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}"