简单的字符串属性似乎不会在XAML GUI中绑定

时间:2015-04-22 16:53:32

标签: c# wpf binding

我有Page我要在string中显示Label属性。 这是我的代码,但标签中不会出现任何内容。

这是我的.xaml

<Page x:Class="MyProject.PageOne"
          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"
        Title="PageOne"
          Name="pageOne>
    <Grid>
     <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    </Grid>
 <Label Grid.Column="0" Content="{Binding ElementName=pageOne, Path=aStr}" FontWeight="Normal" FontSize="43" HorizontalAlignment="Left" Margin="0,00,0,0" VerticalAlignment="Center" Foreground="White"/>
</Grid>

</Page>

这是我的.cs代码

    public partial class PageOne: Page, IPageInterface
    {
       public String aStr{get;set;}
       public PageOne()
            {
                InitializeComponent();

            }
       public void Start()
         {
            aStr = "Test";

        }

    }

1 个答案:

答案 0 :(得分:0)

就您所描述的问题而言,您发布的代码唯一真正错误的是您尚未实现某些方式来发生属性更改通知。因为aStr属性在最初设置Label内容之后才设置为新值,而没有办法接收通知,因此框架无法知道它需要更新Label 1}}内容。

在WPF中,通常完成的两种主要方式(实际上,AFAIK只有两种完全支持的方式)是创建DependencyProperty个实例,或实现INotifyPropertyChanged。要么工作正常。

以下是您的代码应如何实现INotifyPropertyChanged的示例:

public partial class PageOne : Page, IPageInterface, INotifyPropertyChanged
{
    private string _astr;
    public String aStr
    {
        get { return _astr; }
        set { _astr = value; OnPropertyChanged(); }
    }

    public Page1()
    {
        InitializeComponent();
    }

    public void Start()
    {
        aStr = "Test";
    }

    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

实现界面需要几个简单的步骤:

  1. 声明名为PropertyChanged
  2. 的活动
  3. 任何时候更改某个属性,都会引发该事件,并传递要更改的属性的名称。
  4. 请注意,要执行此操作,您无法使用自动实现的属性。您需要自己实现每个属性,使用支持字段,并调用将引发属性的方法。

    .NET提供了方便的[CallerMemberName]属性,我在这里展示了它。因此,在aStr属性的setter方法中,在设置了支持字段的值之后,只需调用不带任何参数的方法,运行时会自动为您填写正确的属性名称。


    现在,您发布的代码在XAML中也存在其他一些问题。首先它不会编译,因为你遗漏了一个"字符,并且因为你有一个额外的</Grid>结束标记。

    另一个可能的问题,虽然由于我们错过了显示此Page对象的完整上下文而无法确切知道,但文本的颜色是白色的。如果您将Label实例放在白色背景上,那么当然即使设置正确,您也无法看到该文字。


    我注意到评论者Franck建议您设置DataContext。事实是,鉴于您发布的代码实际上没有必要,这样做实际上并不能解决您遇到的问题。

    但是如果您确实修复了基础通知问题,那么他的建议是替代方式,您可以实现绑定。通过将DataContext设置为包含属性的对象(此处为您的PageOne类),然后在绑定时,您可以单独指定属性名称,而无需包含ElementName根本不需要使用Path=和属性名称。你可能会发现这种技术更方便,至少在某些时候。


    将来,请花时间提供可靠地再现问题的a good, minimal, complete code example。您更有可能以这种方式得到答案,并且您将确保您获得的任何答案都尽可能好。