我想在我的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。
如果有人可以就如何使其发挥作用给我一些建议,那我真的很感激。
编辑:我现在尝试了这篇文章中建议的所有内容,但它仍然无效。也许这可以帮助识别问题的人,当我绑定一个不在类中的字符串时,它可以工作。答案 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;
希望这会有所帮助......