Как я могу связать содержимое метки со значением из запроса? - PullRequest
1 голос
/ 23 февраля 2020

Я пытаюсь связать содержимое метки на основе результата, полученного от запуска хранимой процедуры. Вот мой XAML:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
    <Label Content="Date:" FontSize="10" />
    <Label x:Name="HomeScreenLabelInfoDate" FontSize="10" FontWeight="DemiBold" FontStyle="Italic" Content="{Binding InfoDate}"/>
    <Label Content="-"/>
    <Label Content="Author:" FontSize="10"/>
    <Label x:Name="HomeScreenLabelInfoAuthor" Margin="3 0" FontSize="10" FontWeight="DemiBold" FontStyle="Italic" Content="{Binding InfoAuthor}"/>
</StackPanel>

А вот мой код:

public HomeUserControl()
{
    InitializeComponent();

    try
    {
        GetPublications();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

public class NewsData
{
    public string InfoTitle { get; set; }

    public string InfoMessage { get; set; }

    public string InfoDate { get; set; }

    public string InfoAuthor { get; set; }
}

public void GetPublications()
{
    string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;

    using (var Connect = new SqlConnection(connstr))
    {
        Connect.Open();
        using (var Command = new SqlCommand("[dbo].[spNewsManagementTb_DisplayNews]", Connect))
        {
            Command.CommandType = CommandType.StoredProcedure;
            Command.Parameters.Add("@entity_id", SqlDbType.VarChar).Value = LoggedInData.LoggedInstitutionId;
            SqlDataReader dr = Command.ExecuteReader();
            while (dr.Read())
            {
                string newsTitle = dr.GetString(0);
                string newsMessage = dr.GetString(1);
                string newsAuthor = dr.GetString(2);
                DateTime newsDate = dr.GetDateTime(3);
                string newsDateFormated = newsDate.ToString("dddd, dd MMMM yyyy");

                NewsData newsData = new NewsData();
                newsData.InfoTitle = newsTitle;
                newsData.InfoDate = newsDateFormated;
                newsData.InfoAuthor = newsAuthor; 

            }

            dr.Close();
            Connect.Close();
        }
    }
}

Всякий раз, когда я запускаю приложение, я не вижу никаких данных на моем GUI. Мне удалось преодолеть это путем непосредственного назначения значений меток из значений, считанных из запроса, но я хотел бы продолжать использовать привязку данных во всем коде для согласованности, но этот способ оказывается довольно сложным для реализации.

РЕДАКТИРОВАТЬ

Я хотел бы отметить, что я новичок в программировании, поэтому я не очень хорош в понимании всех концепций, но свойство INotifyPropertyChanged породило несколько ошибок. Вот код после включения свойства Notify:

public HomeUserControl()
{
    InitializeComponent();

    try
    {
        var newsData = GetPublications();
        this.DataContext = newsData;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

public NewsData : INotifyPropertyChanged
{
    private string Title;

        private string Message;

        private string Date;

        private string Author;

        public event PropertyChangedEventHandler PropertyChanged;

        public NewsData(string infoTitle, string infoMessage, string infoDate, string infoAuthor)
        {
            this.Author = infoAuthor;
            this.Date = infoDate;
            this.Message = infoMessage;
            this.Title = infoTitle;
        }

        public string InfotAuthor
        {
            get { return Author; }

            set
            {
                Author = InfotAuthor;
                OnPropertyChanged();
            }
        }

        public string InfotDate
        {
            get { return Date; }

            set
            {
                Date = InfotDate;
                OnPropertyChanged();
            }
        }

        public string InfotMessage
        {
            get { return Message; }

            set
            {
                Author = InfotMessage;
                OnPropertyChanged();
            }
        }

        public string InfotTitle
        {
            get { return Title; }

            set
            {
                Author = InfotTitle;
                OnPropertyChanged();
            }
        }

        protected void OnPropertyChanged(string Author = null, string Message = null, string Date = null, string Title = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(Author));

            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(Message));

            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(Date));

            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(Title));
        }
}

public NewsData GetPublications()
{
    string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;

    using (var Connect = new SqlConnection(connstr))
    {
        Connect.Open();
        using (var Command = new SqlCommand("[dbo].[spNewsManagementTb_DisplayNews]", Connect))
        {
            Command.CommandType = CommandType.StoredProcedure;
            Command.Parameters.Add("@entity_id", SqlDbType.VarChar).Value = LoggedInData.LoggedInstitutionId;
            SqlDataReader dr = Command.ExecuteReader();
            while (dr.Read())
            {
                string newsTitle = dr.GetString(0);
                string newsMessage = dr.GetString(1);
                string newsAuthor = dr.GetString(2);
                DateTime newsDate = dr.GetDateTime(3);
                string newsDateFormated = newsDate.ToString("dddd, dd MMMM yyyy");

                NewsData newsData = new NewsData();
                newsData.InfoTitle = newsTitle;
                newsData.InfoDate = newsDateFormated;
                newsData.InfoAuthor = newsAuthor; 

            }

            dr.Close();
            Connect.Close();
        }
    }

 return newsData;
}

Ошибки возникают из-за метода GetPublications (), который не распознает NewsData

1 Ответ

1 голос
/ 23 февраля 2020

Внесите следующие изменения в свой код.

  1. Сделайте GetPublications () для возврата типа "NewsData", как показано ниже,

    public NewsData GetPublications()
    {
        string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
        NewsData newsData = new NewsData();
    
        using (var Connect = new SqlConnection(connstr))
        {
            Connect.Open();
            using (var Command = new SqlCommand("[dbo].[spNewsManagementTb_DisplayNews]", Connect))
            {
                Command.CommandType = CommandType.StoredProcedure;
                Command.Parameters.Add("@entity_id", SqlDbType.VarChar).Value = LoggedInData.LoggedInstitutionId;
                SqlDataReader dr = Command.ExecuteReader();
                while (dr.Read())
                {
                    string newsTitle = dr.GetString(0);
                    string newsMessage = dr.GetString(1);
                    string newsAuthor = dr.GetString(2);
                    DateTime newsDate = dr.GetDateTime(3);
                    string newsDateFormated = newsDate.ToString("dddd, dd MMMM yyyy");
    
    
                    newsData.InfoTitle = newsTitle;
                    newsData.InfoDate = newsDateFormated;
                    newsData.InfoAuthor = newsAuthor; 
    
                }
    
                dr.Close();
                Connect.Close();
            }
        }
    
        return newsData;
    }
    
  2. В выделенном фрагменте кода (конструкторе) вашего пользовательского элемента управления выполните следующие изменения:

    public HomeUserControl()
    {
        InitializeComponent();
    
        try
        {
            var newsData = GetPublications(); 
            this.DataContext = newsData;
        }
        catch (Exception ex)
        {
    
            MessageBox.Show(ex.Message);
        }
    }
    
  3. Реализуйте INotifyPropertyChanged для класса NewsData. Ниже приведена ссылка о том, как этого добиться

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification

Небольшое предложение: - Я предпочитаю делать вызов из базы данных в asyn c так, чтобы мой пользовательский элемент управления загружал и ожидал поступления и привязки данных.

Попробуйте и сообщите нам, если у вас все еще есть какие-либо проблемы.

Редактировать : - - Добавлен дополнительный фрагмент кода после обновленного вопроса.

Привет, я видел некоторые ошибки из вашего кода.

  1. В вашем .xaml вы используете "InfoDate "и" InfoAuthor "для привязки к вашему лейблу. Но ваши NewsData не имеют этих свойств.

Имена ваших свойств NewsData - "InfotAuthor" и "InfotDate" - В нем есть "t"

Я использовал ваш код xaml (после внесения вышеуказанных изменений).

Без наследования INotifyPropertyChanged я могу просматривать данные. Я полагаю, что если вы сделаете вышеуказанные изменения, вы сможете увидеть данные в своем представлении.

Если вы хотите реализовать INotifyPropertyChanged, вы можете выполнить следующие действия:

publi c class NewsData: INotifyPropertyChanged {private string _title;

private string _message;

private string _date;

private string _author;

public string InfoAuthor
{
    get { return _author; }

    set
    {
        _author = value;
        OnPropertyChanged("InfoAuthor");
    }
}

public string InfoDate
{
    get { return _date; }

    set
    {
        _date = value;
        OnPropertyChanged("InfoDate");
    }
}

public string InfoMessage
{
    get { return _message; }

    set
    {
        _message = value;
        OnPropertyChanged("InfoMessage");
    }
}

public string InfoTitle
{
    get { return _title; }

    set
    {
        _title = value;
        OnPropertyChanged("InfoTitle");
    }
}

protected void OnPropertyChanged(string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

public event PropertyChangedEventHandler PropertyChanged;

}

Я сделал приватные члены, чтобы начать с "_" с верблюжьей оболочкой (это просто правильные соглашения об именах для внутренних полей)

Я реализовал OnPropertyChanged () и я вызываю из каждого метода установки свойства.

В вашем методе установки вы пытаетесь установить, как показано ниже, что неверно,

Date = InfotDate;

Вам необходимо установить "Дата = значение;"

Надеюсь, вы сможете понять разницу с моим обновленным ответом.

Попробуйте и сообщите нам, если у вас все еще есть любой другой вопрос.

Если он отвечает на ваш вопрос, примите его в качестве ответа.

...