PropertyChangedEventHandler всегда нулевой в привязке silverlight - PullRequest
2 голосов
/ 22 сентября 2010

Я пытался решить эту проблему в течение некоторого времени. Я пытаюсь привязать текст TextBlock к строковому свойству, используя интерфейс INotifyPropertyChanged. По какой-то причине PropertyChangedEventHandler всегда имеет значение null, когда значение свойства изменяется, поэтому цель никогда не обновляется ... Какие-либо предложения? Код ниже:

XAML код:

<UserControl x:Class="MoleDashboard.MainPage"
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" 
xmlns:basics="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
xmlns:datacontrols="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"
xmlns:prop="clr-namespace:MoleDashboard"


<UserControl.Resources>
<prop:YearScreen x:Key="YearScreenProps"/>
</UserControl.Resource>

<TextBlock Margin="10 5" x:Name="DataGridLabel" Visibility="Visible" Text="{Binding   YearProperty, Source={StaticResource YearScreenProps}, Mode=OneWay}"/>

Связанный код недвижимости:

public class YearScreen : INotifyPropertyChanged
{
    private string metricProperty;

    private string yearProperty;

    public event PropertyChangedEventHandler PropertyChanged;

    public YearScreen()
    {
    }

    public string YearProperty
    {
        get { return yearProperty; }
        set { yearProperty = value; this.OnPropertyChanged("YearProperty"); }
    }

    public string MetricProperty
    {
        get { return metricProperty; }
        set { metricProperty = value; this.OnPropertyChanged("MetricProperty"); }
    }


    public void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }


}

Ответы [ 2 ]

2 голосов
/ 22 сентября 2010

Это основано на предоставленных комментариях, а не только на вопросе выше.

В основном проблема заключается в том, что вы создаете обновление второго экземпляра вашей ViewModel (называемого YearScreen в вашем коде) и обновляете его.

YearScreen уже создается и привязывается к вашему Xaml включением:

<UserControl.Resources>
    <prop:YearScreen x:Key="YearScreenProps"/>
</UserControl.Resource>

Затем вы создаете второй ViewScreen в другом месте кода (через новый ViewScreen ()) и обновляете его, однако нет никакой связи между двумя экземплярами ViewScreen, поэтому на странице Xaml ничего не будет обновляться.

Одно из возможных (быстрых) решений:

Создайте свой YearScreen как синглтон. То есть добавить статический метод доступа типа YearScreen в класс и установить его из конструктора.

    public class YearScreen : INotifyPropertyChanged
    {
        private static YearScreen _This;

        public static YearScreen This { get { return _This; } }

[snip]

        public YearScreen()
        {
            _This = this;
        }

Вы можете получить доступ к «единственному» экземпляру вашего YearScreen из другого места, используя статический одноэлементный метод доступа, например ::

.
YearScreen.This.YearProperty = DateTime.Now.ToString():

Существуют лучшие шаблоны для обмена ViewModel, чем синглтонами, но это поможет вам.

Шаблон, с которого вы начали - это ViewFirst создание (представление создает ViewModel). ModelFirst делает наоборот, но плохо, потому что модель знает, как она отображается. Использование объекта контроллера для создания View и ViewModel и их соединения является лучшей альтернативой, но тогда это становится довольно сложным. Использование внедрения объектов одного экземпляра является лучшим вариантом, но включает в себя целый набор новых концепций. Поиск Silverlight Prism после решения ваших текущих проблем.

0 голосов
/ 22 сентября 2010

Вместо того, чтобы создавать ViewModel в ресурсах, вы должны установить его в DataContext представления из внешнего кода.

Если вы действительно хотите поместить его в ресурсы подобным образом, вы можете получить его из ресурсов в коде метода Loaded или в конструкторе после вызова initializecomponent.Вот так:

private YearScreen model;

public MainPage()
{
    this.Loaded += MainPage_Loaded;
    this.InitializeComponent();
}

void MainPage_Loaded(object sender, EventArgs e)
{
    this.model = (YearScreen)this.Resources["YearScreenProps"];
}

Может быть, выставить его как свойство, чтобы вы могли получить к нему внешний доступ.Но лично я предпочел бы создать модель внешне, а не передавать ее в представление.Поместите его в DataContext.

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