WPF使用类参数绑定标签内容

时间:2018-05-20 21:02:49

标签: c# wpf data-binding

我已经阅读了网络上的一些教程,MSDN上的文档和答案,但我仍然不理解WPF中的绑定。我有这样的C#类

namespace Organizer

{

public class UIDate
{
    private int year;
    private int month;
    private String dateStr;

    public UIDate()
    {
        DateTime actualDateTime = DateTime.Now;
        year = actualDateTime.Year;
        month = actualDateTime.Month;
        dateStr = Convert.ToString(Year);
    }

    public int Year
    {
        get { return year; }
        set { year = value; }
    }

    public int Month
    {
        get { return month; }
        set { month = value; }
    }

    public String DateStr
    {
        get { return dateStr; }
        set { dateStr = value; }
    }
}

}

我希望将属性DateStr与此处的标签内容绑定

<Window x:Class="Organizer.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800" WindowState="Normal">
<DockPanel>
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
        <Button MinWidth="25" MaxHeight="25" Margin="8"/>
        <Button MinWidth="15" MaxHeight="15" Margin="5"/>
        <Label Name="UIDateYM" Content="{Binding Path=UIDate.DateStr, UpdateSourceTrigger=PropertyChanged}" Margin="0, 8"/>

我相信XAML的其余部分是无关的。

和xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Organizer;

namespace Organizer
{
    /// <summary>
    /// Logika interakcji dla klasy MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {            
            InitializeComponent();
            UIDate uiDate = new UIDate();
            this.DataContext = uiDate;
        }
    }
}

当应用程序运行时,标签中没有txt。内容为空。 我检查了我的uiDate对象,它的工作原理。正如我想的那样,财产和它的领域具有正确的价值。如何绑定它们?我错过了什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

  1. 您必须设置数据上下文(ok)= - &gt; (你已经这样做了,如果你使用MVVM有更优雅的方式,但那很好)
    1. 您已在xaml中设置了绑定,但是您绑定了类名UIDate.DateStr
  2. 如果将数据上下文设置为元素。所有子节点将具有相同的数据上下文 - &gt;只要你没有改变它。 (您将其设置为window / this,因此作为子项的标签也具有相同的数据上下文)

    请记住,您的DataContext已经设置好,您可以直接访问其中的属性。

    变化:

    {Binding Path=UIDate.DateStr, UpdateSourceTrigger=PropertyChanged}
    

    为:

    {Binding Path=DateStr}
    

    这里不需要updatesourcetrigger。 BEC。触发器在这里通知有界对象某些东西发生了变化。 (只在这个方向)。

    在您的情况下,标签不是输入控件,只需要显示值。意味着控件不需要通知绑定对象某些内容发生了变化。

    下一点: 如果您不想更改对象中的值。您可以保持代码不变。 BEC。如果设置了一个对象(在您的情况下设置了数据上下文),则引用此对象的所有绑定都将更新。所以初始值已设定。

    但是如果在绑定了对象时更改了值,则需要通知Control。你应该寻找接口INotifyPropertyChanged ...

    迎接希望现在明白