سؤال

أريد أن محاكاة تغيير البيانات في النموذج وبعد أن البيانات التي تنعكس في XAML.كما أفهم أنا بحاجة إلى تنفيذ INotifyPropertyChanged.

ومع ذلك ، في المثال التالي من التعليمات البرمجية ، XAML يعرض البيانات من العميل مرة واحدة فقط ولكن التاريخ و الوقت لا يتغير أبدا.

ماذا علي أن التغيير في المثال التالي لجعل XAML باستمرار عرض التاريخ والوقت الحالي كما أنه التغييرات في النموذج ؟

على وجه الخصوص ، أنا لا أفهم كيف ملزم أن تعرف متى تحقق النموذج ، كل ثانية ؟ 10 مرات في الثانية ؟ لا يوجد حالة الاستجابة.ما أنا في عداد المفقودين هنا ؟

XAML:

<Window x:Class="TestBinding99382.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestBinding99382"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>
        <ObjectDataProvider 
              x:Key="DataSourceCustomer" 
              ObjectType="{x:Type local:ShowCustomerViewModel}" 
              MethodName="GetCurrentCustomer"/>
    </Window.Resources>

    <DockPanel DataContext="{StaticResource DataSourceCustomer}">
        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
            <TextBlock Text="{Binding Path=FirstName}"/>
            <TextBlock Text=" "/>
            <TextBlock Text="{Binding Path=LastName}"/>
        </StackPanel>
        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
            <TextBlock Text="{Binding Path=TimeOfMostRecentActivity}"/>
        </StackPanel>

    </DockPanel>
</Window>

التعليمات البرمجية خلف:

using System.Windows;
using System.ComponentModel;
using System;

namespace TestBinding99382
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }

    //view model
    public class ShowCustomerViewModel : INotifyPropertyChanged
    {
        private Customer _currentCustomer;

        public Customer CurrentCustomer
        {
            get
            {
                return _currentCustomer;
            }

            set
            {
                _currentCustomer = value;
                this.RaisePropertyChanged("CurrentCustomer");
            }
        }

        public ShowCustomerViewModel()
        {
            _currentCustomer = Customer.GetCurrentCustomer();
        }

        public Customer GetCurrentCustomer()
        {
            return _currentCustomer;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }

    //model
    public class Customer : INotifyPropertyChanged
    {
        private string _firstName;
        private string _lastName;
        private DateTime _timeOfMostRecentActivity;

        public string FirstName
        {
            get
            {
                return _firstName;
            }
            set
            {
                _firstName = value;
                this.RaisePropertyChanged("FirstName");
            }
        }

        public string LastName
        {

            get
            {
                return _lastName;
            }
            set
            {
                _lastName = value;
                this.RaisePropertyChanged("LastName");
            }
        }

        public DateTime TimeOfMostRecentActivity
        {

            get
            {
                return _timeOfMostRecentActivity;
            }
            set
            {
                _timeOfMostRecentActivity = value;
                this.RaisePropertyChanged("TimeOfMostRecentActivity");
            }
        }

        public static Customer GetCurrentCustomer()
        {
            return new Customer 
                     { FirstName = "Jim"
                       , LastName = "Smith"
                       , TimeOfMostRecentActivity = DateTime.Now};
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }
}
هل كانت مفيدة؟

المحلول

ربما أنا لا تحصل على ما كنت ترغب في هذا القانون القيام به.

قمت بإنشاء كائن العميل الذي ينفذ INotifyPropertyChanged.لديك فئة أخرى وهو مصنع XAML للحصول على سبيل المثال.الآن يمكنك إنشاء العملاء سبيل المثال مع خصائص محددة مسبقا.عرض يعرض لهم.إلا إذا قمت بتغيير خصائص بطريقة ما ، رأي لن يتم تحديث.

لقد تم إضافة زر إلى WPF عرض

<Button DockPanel.Dock="Bottom" 
        x:Name="UpdateTime" 
        Click="UpdateTime_Click">
                 Update Activity Timestamp
 </Button>  

التعليمات البرمجية C#-خلف:

private void UpdateTime_Click(object sender, RoutedEventArgs e)
{
     Customer.GetCurrentCustomer().TimeOfMostRecentActivity = DateTime.Now;
}

أنا أيضا تغيير نوع العميل لإنشاء مثيل واحد على العملاء الحالية

private static Customer _CurrentCustomer;

public static Customer GetCurrentCustomer()
{
    if (null == _CurrentCustomer)
    {
        _CurrentCustomer = new Customer 
        {   FirstName = "Jim"
           , LastName = "Smith"
           , TimeOfMostRecentActivity = DateTime.Now 
         };
    }
         return _CurrentCustomer;
}

الآن في كل مرة كنت اضغط على زر ، DateTime خاصية تعديل و عرض التحديثات التلقائية بسبب INotifyPropertyChanged آلية.رمز يبدو أن العامل AFAISee.

نصائح أخرى

الكود يعمل بشكل صحيح.التاريخ والوقت الحالي سوف يتم تحديث تلقائيا عن طريق السحر.لديك لتنفيذ بعض الموقت لتحديثه.

على سبيل المثال يمكنك إضافة هذا إلى فئة العملاء:

private Timer _timer;

public Customer()
{
    _timer = new Timer(UpdateDateTime, null, 0, 1000);
}

private void UpdateDateTime(object state)
{
    TimeOfMostRecentActivity = DateTime.Now;
}

يبدو لك أن تكون ملزمة Customer, ، Customer لا تنفيذ INotifyPropertyChanged.محاولة تنفيذ INotifyPropertyChanged على Customer, ، ومعرفة ما إذا كان يصلح له.وهذا يتطلب الانتقال إلى دليل خصائص (بدلا من أن تنفذ تلقائيا خصائص) من أجل رفع الحدث.

يمكنك التحقق من كيفية العديد من المرات GetCurrentCustomer() يحصل يسمى ؟ ربما إعادة يخلق حالات جديدة في كل وقت.

الخاص بك العملاء بحاجة إلى الدرجة تنفيذ INotifyPropertyChanged وتحتاج إلى استدعاء الحدث خلال أساليب اضع من خصائص العملاء.

تحرير:بحثت في الكود مرة أخرى أتساءل عما إذا كان الخاص بك ShowCustomerViewModel فئة يحتاج إلى الاستماع إلى _currentCustomer PropertyChanged الحدث وإرسالها الخاصة PropertyChangedEvent.يستحق رصاصة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top