Содержание метки привязки WPF с параметром класса - PullRequest
0 голосов
/ 21 мая 2018

Я прочитал кучу учебников в сети, документы по 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 голосов
/ 21 мая 2018
  1. Вы должны установить контекст данных (хорошо) = -> (вы сделали это, если вы используете MVVM, есть более элегантные способы, но это хорошо)
  2. вы установили привязку в xaml, но вы привязываетесь к имени класса UIDate.DateStr

, если вы установили контекст данных для элемента.все дочерние узлы будут иметь одинаковый контекст данных -> до тех пор, пока вы его не изменили.(вы устанавливаете это в window / this, поэтому метка как дочерняя также имеет тот же контекст данных)

имейте в виду, ваш DataContext уже установлен, вы можете напрямую получить доступ к свойствам в нем.

изменить:

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

на:

{Binding Path=DateStr}

здесь не требуется источник обновлений.Bec.Триггеры здесь, чтобы сообщить ограниченному объекту, что что-то изменилось.(только в этом направлении).

В вашем случае ваш ярлык не является элементом управления вводом и должен только показывать значение.означает, что элемент управления не должен информировать связанный объект о том, что что-то изменилось.

Следующий пункт: если вы не собираетесь изменять значение в вашем объекте.Вы можете сохранить свой код как есть.Bec.если вы устанавливаете объект (в вашем случае вы задаете контекст данных), все привязки, которые ссылаются на этот объект, обновляются.Итак, начальное значение установлено.

Но если вы изменяете значение, когда объект уже связан, вам необходимо уведомить Control.Вам следует поискать интерфейс INotifyPropertyChanged ...

приветствует надежду, теперь все ясно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...