无法在WP8 App中绑定字符串属性

时间:2014-02-16 15:37:08

标签: c# wpf xaml windows-phone-8 binding

我想在我的WP8应用程序中实现自动更新Binding。我想要的只是将一个类的String属性绑定到一个文本块,但是它没有工作那么长时间我没有绑定没有该类的字符串。

正文块:

<Textblock Text="{Binding Path=MARK1._mark, ElementName=Page, Mode=OneWay}"/>

MARK1的定义:

public partial class MainPage : PhoneApplicationPage
{
public static MARK MARK1 = new MARK("example")
public MainPage(){} //constructor
}

我在与其他名称空间相同的名称空间中实现了像this example这样的类MARK。 _mark代表PersonName。

如果有人可以就如何使其发挥作用给我一些建议,那我真的很感激。

编辑:我现在尝试了这篇文章中建议的所有内容,但它仍然无效。也许这可以帮助识别问题的人,当我绑定一个不在类中的字符串时,它可以工作。

2 个答案:

答案 0 :(得分:1)

它更简单,你不需要使用ElementName(除非没有其他选项有效,否则通常不会推荐它);而是通过在构造函数中设置它来直接获取DataContext。

如果您使用ElementName,那意味着您正在尝试从指定元素中获取属性。在这种情况下Page。如果您将MARK添加为类的实例属性而不是static,并假设PhoneApplicationPage实例名为x:Name="Page",则您的代码应该有效。如果值发生变化,通知可能无效,如下所示。

public partial class MainPage : PhoneApplicationPage
{
    // Constructor
    public MainPage()
    {
        InitializeComponent();

        this.DataContext = new MARK()
        {
            Name = "UserName"
        };

    }

然后,在正确创建DataContext的情况下,您可以直接引用该属性:

<Textblock Text="{Binding Path=Name}"/>

或者,使用假定Path的快捷语法:

<Textblock Text="{Binding Name}"/>

然后,您可以创建一个名为MARK的类,并添加要为绑定公开的属性作为类的一部分。当属性值更改时,您需要引发属性值已更改的事件。您可以使用INotifyPropertyChanged界面执行此操作。

// others, plus....
using System.ComponentModel;
using System.Runtime.CompilerServices;

public class MARK : INotifyPropertyChanged
{
    private string _name;
    public string Name {
        get { return _name; }
        set {
            if (_name != value)
            {
                _name = value;
                RaisePropertyChanged();
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    // by using the CallerMemberName attribute, you don't need to specify
    // the name of the property, the compiler provides it automatically
    private void RaisePropertyChanged([CallerMemberName] string propName = "")
    {
        if (string.IsNullOrWhiteSpace(propName)) { 
            throw new ArgumentNullException("propName"); 
        }
        if (PropertyChanged != null) {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }
}

答案 1 :(得分:0)

您如何设置datacontext。

首先设置datacontext。如果你没有在xaml中设置datacontext,那么在codebehind中设置它。

this.DataContext = this;

希望这会有所帮助......