2

INotifyPropertyChanged、PropertyChanagedEventHandler、および PropertyEventChangedArgs が見つからないという問題があります。

「型または名前空間名 'PropertyChangedEventArgs' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)」

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
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;

namespace WhackaMole_MVVM
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new WhackAMoleViewModel();
        }
    }

    public class WhackAMoleViewModel : PropertyChangedBase
    {
        private List<Mole> _moles;
        public List<Mole> Moles
        {
            get { return _moles; }
        }

        private System.Threading.Timer timer;
        private System.Random random = new Random();

        public WhackAMoleViewModel()
        {
            _moles = Enumerable.Range(1, 9).Select(x => new Mole()).ToList();
            timer = new Timer(x => RaiseRandomMole(), null, 0, 300);
        }

        private void RaiseRandomMole()
        {
            //If random number is less than 5 skip this iteration
            if (random.Next(1, 10) > 5)
                return;

            //Choose a random mole
            var mole = Moles[random.Next(0, 8)];

            //If it's already raised, do nothing
            if (mole.IsUp)
                return;

            //Raise it
            mole.IsUp = true;

            //Then Get it down somewhere between 1 and 2 seconds after
            Task.Factory.StartNew(() => Thread.Sleep(random.Next(1000, 2000)))
                        .ContinueWith(x => mole.IsUp = false);
        }
    }


    public class Mole : PropertyChangedBase
    {
        private bool _isUp;
        public bool IsUp
        {
            get { return _isUp; }
            set
            {
                _isUp = value;
                OnPropertyChanged("IsUp");
            }
        }
    }

    public class PropertyChangedBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            Application.Current.Dispatcher.BeginInvoke((Action)(() =>
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
            }));
        }
    }
}

XAML:

<Window x:Class="WhackaMole_MVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <ItemsControl ItemsSource="{Binding Moles}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="3" Columns="3" IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Image x:Name="Mole" Height="0" Width="100" 
                       Source="C:\Users\MonAmi\Documents\Visual Studio 2012\Projects\WhackaMole\WhackaMole\mole2.png"
                       Stretch="Fill"
                       VerticalAlignment="Bottom"/>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsUp}" Value="True">
                        <DataTrigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard TargetName="Mole">
                                    <DoubleAnimation Storyboard.TargetProperty="Height" 
                                                     From="0" To="77"
                                                     Duration="00:00:00.3"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </DataTrigger.EnterActions>
                        <DataTrigger.ExitActions>
                            <BeginStoryboard>
                                <Storyboard TargetName="Mole">
                                    <DoubleAnimation Storyboard.TargetProperty="Height"
                                                     From="77" To="0"
                                                     Duration="00:00:00.3"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </DataTrigger.ExitActions>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>
4

1 に答える 1

7

コンパイラは完全に正しいです。必要なもの:

using System.ComponentModel;

...その名前空間と同じように、usingディレクティブで。PropertyChangedEventArgs(もちろん、それへのすべての参照を完全に修飾することもできます。)

このエラー メッセージが表示されるたびに最初に行うことは、関連する型が含まれている名前空間とアセンブリを見つけ、usingディレクティブとアセンブリ参照を確認することです...基本的に、コンパイラ メッセージが示唆しているように。

于 2013-05-17T16:42:22.203 に答える