我已经阅读了网络上的一些教程,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对象,它的工作原理。正如我想的那样,财产和它的领域具有正确的价值。如何绑定它们?我错过了什么?
谢谢。
答案 0 :(得分:1)
如果将数据上下文设置为元素。所有子节点将具有相同的数据上下文 - &gt;只要你没有改变它。 (您将其设置为window / this,因此作为子项的标签也具有相同的数据上下文)
请记住,您的DataContext已经设置好,您可以直接访问其中的属性。
变化:
{Binding Path=UIDate.DateStr, UpdateSourceTrigger=PropertyChanged}
为:
{Binding Path=DateStr}
这里不需要updatesourcetrigger。 BEC。触发器在这里通知有界对象某些东西发生了变化。 (只在这个方向)。
在您的情况下,标签不是输入控件,只需要显示值。意味着控件不需要通知绑定对象某些内容发生了变化。
下一点: 如果您不想更改对象中的值。您可以保持代码不变。 BEC。如果设置了一个对象(在您的情况下设置了数据上下文),则引用此对象的所有绑定都将更新。所以初始值已设定。
但是如果在绑定了对象时更改了值,则需要通知Control。你应该寻找接口INotifyPropertyChanged ...
迎接希望现在明白