Наиболее подходящий класс bitmap для модели

#c# #wpf #mvvm #model #bitmap

#c# #wpf #mvvm #Модель #bitmap

Вопрос:

Я пишу простое приложение WPF с использованием MVVM. Какой класс наиболее удобен для извлечения растровых изображений из моделей и дальнейшей привязки данных: Bitmap, BitmapImage, BitmapSource?

 public class Student
{
    public <type?> Photo
    {
        get;
    }
}
  

Или, может быть, я могу каким-то образом преобразовать Bitmap в BitmapSource, используя ViewModel?

Комментарии:

1. Что вы подразумеваете под удобным?

Ответ №1:

Я всегда использую BitmapImage , он довольно специализированный и предлагает приятные свойства и события, которые могут быть полезны (например, IsDownloading , DownloadProgress amp; DownloadCompleted ).

Ответ №2:

Я полагаю, что более гибким способом является возврат photo (или любого другого растрового изображения) в виде потока. Кроме того, если фотография была изменена, модель должна запустить событие photo changed, а клиент должен обработать событие photo changed, чтобы получить новую фотографию.

 public class PhotoChangedEventArgs : EventArgs
{

}

public class Student
{
    public Stream GetPhoto()
    {
        // Implementation.
    }

    public event EventHandler<PhotoChangedEventArgs> OnPhotoChanged;
}

public class StudentViewModel : ViewModelBase
{

    // INPC has skipped for clarity.
    public Student Model
    {
        get;
        private set;
    }

    public BitmapSource Photo
    {
        get
        {
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.StreamSource = Model.Photo;
            image.EndInit();
            image.Freeze();
            return image;
        }
    }

    public StudentViewModel(Student student)
    {
        Model = student;

        // Set event handler for OnPhotoChanged event.
        Model.OnPhotoChanged  = HandlePhotoChange;
    }

    void HandlePhotoChange(object sender, PhotoChangedEventArgs e)
    {
        // Force data binding to refresh photo.
        RaisePropertyChanged("Photo");
    }
}