2

我有一个像这样的 C# 类:

public partial class MyClass: UserControl
{
    public String SomeText{get;set;}
    ...

    public MyClass(String Text)
    {
        this.InitializeComponent();
        SomeText = Text;
    }

}

我想SomeText在我的 XAML 文件中获取该属性。如何做这样的事情?

<TextBlock Text="{THIS IS HERE I WANT TO HAVE SomeText}"></TextBlock>

我是 C# 新手,所以我不知道该怎么做。一定有简单的方法吗?

4

2 回答 2

3

UserControl元素 aName然后绑定到它,如下例所示。如果您的文本不会更改,则应调用InitialiseComponent.

<UserControl x:Class="WpfApplication1.UserControl1"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             x:Name="root">
    <Grid>
        <TextBlock Text="{Binding SomeText,ElementName=root}"/>
    </Grid>
</UserControl>

如果您SomeText可能会更改,那么您需要将其声明为 aDependencyProperty而不是普通的旧string属性。这看起来像下面这样:

    public string SomeText
    {
        get { return (string)GetValue(SomeTextProperty); }
        set { SetValue(SomeTextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SomeText.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SomeTextProperty =
        DependencyProperty.Register("SomeText", typeof(string), typeof(UserControl1), new UIPropertyMetadata(""));

然后,您应该将绑定更改为如下所示,当您更改SomeString.

<TextBlock Text="{Binding SomeText,ElementName=root,UpdateSourceTrigger=PropertyChanged}"/>
于 2012-12-06T16:23:15.253 回答
1

首先,更正一下:

那是Property(MSDN),而不是Attribute (MSDN),这是两个完全不同的概念。

第二:

WPF 有一个称为DependencyProperties (MSDN)的概念,您必须利用它来在 WPF 中构建复杂的自定义 UI 控件。

第三:

有时您并不需要在 UI 中声明属性。WPF 使您能够通过其强大的DataBinding EngineMVVM Pattern将 UI 与数据分离。所以,再想想你声明的这个控件是否是声明你的字符串属性的正确位置。

如果您打算在 WPF 中工作,我建议您熟悉所有这些概念。

给我更多关于你想要做什么的细节,我可以给你更多的见解。

编辑:

基本上,您需要做的是DependencyProperty在您的控件中声明 a ,如下所示:

public static readonly DependencyProperty DisplayNameProperty = DependencyProperty.Register("DisplayName", typeof(string), typeof(mycontrol));

public string DisplayName
{
    get { return GetValue(DisplayNameProperty).ToString(); }
    set { SetValue(DisplayNameProperty, value); }
}

然后,在 XAML 中:

<TextBlock Text="{Binding DisplayName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}"/>

请记住,WPF 需要与其他框架完全不同的思维方式,所以我的建议仍然有效:如果您打算认真使用 WPF,请熟悉 MVVM 和数据绑定。

于 2012-12-06T16:23:06.553 回答