4

モデル内で変化するデータをシミュレートし、そのデータをXAMLに反映させたいと思います。私が理解しているように、INotifyPropertyChangedを実装する必要があります。

ただし、次のコード例では、XAMLは顧客からのデータを1回だけ表示しますが、日付と時刻は変更されません。

XAMLがモデル内で変更されたときに現在の日付と時刻を継続的に表示するようにするには、次の例で何を変更する必要がありますか?

特に、Bindingがモデルを毎秒チェックするタイミングをどのように知るのかわかりませんか?1秒間に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));
            }
        }
    }
}
4

5 に答える 5

4

このコードであなたが望んでいることを私は得ていないかもしれません。

INotifyPropertyChanged を実装する顧客オブジェクトを作成しました。XAML がインスタンスに到達するためのファクトリである別のクラスがあります。ここで、定義済みのプロパティを持つ Customer インスタンスを作成します。ビューはそれらを表示します。なんらかの方法でプロパティを変更しない限り、View は更新されません。

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;
}

また、Customer タイプを変更して、Current Customer の単一インスタンスを作成しました

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 で動作しているようです。

于 2009-05-12T08:26:06.833 に答える
3

コードは正しく機能しています。現在の日付と時刻は、魔法によって自動的に更新されることはありません。あなたはそれを更新するためにいくつかのタイマーを実装する必要があります。

たとえば、これをCustomerクラスに追加できます。

private Timer _timer;

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

private void UpdateDateTime(object state)
{
    TimeOfMostRecentActivity = DateTime.Now;
}
于 2009-05-12T08:06:23.277 に答える
0

にバインドしているようCustomerで、を実装Customer していませんINotifyPropertyChanged。に実装INotifyPropertyChangedしてみてCustomer、それで修正されるかどうかを確認してください。これには、イベントを発生させるために(自動的に実装されたプロパティではなく)手動プロパティに移動する必要があります。

于 2009-05-12T07:42:18.917 に答える
0

顧客クラスはINotifyPropertyChangedを実装する必要があり、Customersのプロパティのセッターメソッド中にイベントを呼び出す必要があります。

編集:コードをもう一度見てみましたが、ShowCustomerViewModelクラスが_currentCustomer PropertyChangedイベントをリッスンし、それを独自のPropertyChangedEventとして転送する必要があるかどうか疑問に思います。試してみる価値。

于 2009-05-12T07:44:01.397 に答える
0

GetCurrentCustomer()が呼び出される回数を確認できますか?たぶん、それは常に新しいインスタンスを再作成するだけです。

于 2009-05-12T07:56:49.020 に答える