XAML:在InitializeComponent()之后数据绑定到窗口不起作用

时间:2014-02-05 23:27:07

标签: c# wpf xaml data-binding

我是XAML的新手,我正试图将我的窗口(步步高板)的得分属性绑定到控件。

我能够通过后面的代码使其工作如下:

public partial class BgBoard : Window
{
    public BgBoard()
    {
        InitializeComponent();
        DataContext = this;
        _Score = 999;
    }
    private int _Score;
    public string Score { get { return _Score.ToString(); } }
}

XAML

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    xmlns:bgb="clr-namespace:BackgammonBoard"
    xmlns:Properties="clr-namespace:BackgammonBoard.Properties"      x:Class="BackgammonBoard.BgBoard"
    Title="Backgammon board" Width="750" Height="500" MinWidth="375" MinHeight="250">    
    <TextBlock x:Name="Player_Score" Text="{Binding Score}"/>
</Window>

接下来,我想在XAML中声明datacontext而不是后面的代码。我从后面的代码中删除了“Datacontext = This”,并在XAML中将以下属性添加到了我的窗口中:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

现在我的用户界面上不再显示分数。

但是,如果我在调用InitilalizeComponent()之前初始化代码中的分数,则会再次显示分数:

public BgBoard()
{
    _Score = 999;
    InitializeComponent(); 
}   

所以我的问题是,我应该在XAML中做些什么来确保每次在后面的代码中修改得分时正确显示得分(而不仅仅是在InitializeComponent()之前初始化得分?

2 个答案:

答案 0 :(得分:1)

您没有看到分数的原因是该属性未向用户界面发出“更改通知”,您需要实施“INotifyPropertyChanged”(点击链接进行说明)

答案 1 :(得分:0)

您可以将数据绑定到DependencyProperty的{​​{1}}。 DependencyObjectWindow,因此您只需要DependencyObject ...而且您也无需先将值转换为DependencyProperty。试试这个:

string

如果您使用public static DependencyProperty ScoreProperty = DependencyProperty.Register("Score", typeof(int), typeof(BgBoard)); public int Score { get { return (int)GetValue(ScoreProperty); } set { SetValue(ScoreProperty, value); } } public BgBoard() { Score = 999; InitializeComponent(); } ,那么您甚至可以从XAML文件绑定数据,而无需设置DependencyProperty

Window.DataContext