2013-12-21 5 views
0

Я хочу, чтобы наследовать этот классКак наследовать класс?

[DataContract] 
public class Item 
{ 
    string _name; 
    string _path; 
    long _size; 
    byte[] _image; 
    public Item(string Name, string path, long Size, byte[] image) 
    { 
     _name = Name; 
     _path = path; 
     _size = Size; 
     _image = image; 
    } 
    [DataMember] 
    public string Name 
    { 
     get { return _name; } 
     set { } 
    } 
    [DataMember] 
    public string Path 
    { 
     get { return _path; } 
     set { } 
    } 
    [DataMember] 
    public long Size 
    { 
     get { return _size; } 
     set { } 
    } 
    [DataMember] 
    public string SizeToString 
    { 
     get 
     { 
      if (_size == 0) return "Folder"; 
      return CnvrtUnit(_size); 
     } 
     set { } 
    } 
} 

Я пытался наследовать его:

public class ItemEx : Item 
{ 
    public ImageSource Icon 
    { 
     get 
     { 
      BitmapImage bi = new BitmapImage(); 
      using (MemoryStream ms = new MemoryStream(_image)) 
      { 
       bi.BeginInit(); 
       bi.CacheOption = BitmapCacheOption.OnLoad; 
       bi.StreamSource = ms; 
       bi.EndInit(); 
      } 
      return bi; 
     } 
     set { } 
    } 
} 

тогда, когда я задаю экземпляр ItemEx к экземпляру «Пункт», он не работает

public void Assign(Item item) 
{ 
    ItemEx x = item as ItemEx; //its still null 
} 

Почему это происходит? и что я должен сделать, чтобы заставить его работать?

PS:Мне нужно наследовать этот класс, потому что он пришел из службы WCF, которая не проходит ImageSource, поэтому я прошел его как byte[] то элемент должен содержать ImageSource под названием «Икона» для WPF MVVM цели ,

+1

Вы не можете переопределить класс. Вы можете наследовать от методов класса и переопределения, свойств и т. Д. – MAV

+1

Он правильно унаследовал, но неправильно использовал терминологию. –

+0

Да, моя ошибка, как наследовать этот класс –

ответ

0

нашел идеальное решение

public class ItemEx : Item 
{ 
public byte[] IconData 
    { 
     get { return icon; } 
     set 
     { 
      icon = value; 
      Icon = null; 
     } 
    } 
    public ImageSource Icon 
    { 
     get { return ToImageSource(IconData); } 
     set { RaisePropertyChanged("Icon"); } 
    } 
} 

public static ImageSource ToImageSource(byte[] icon) 
    { 
     if (icon != null) 
     { 
      BitmapImage biImg = new BitmapImage(); 
      MemoryStream ms = new MemoryStream(icon); 
      biImg.BeginInit(); 
      biImg.StreamSource = ms; 
      biImg.EndInit(); 
      return biImg; 
     } 
     return null; 
    } 
0

Я думаю, что вы можете передать байт [] _image к ImageSource, как показано ниже, а не пытаться переопределить класс:

private static BitmapImage LoadImage(byte[] imageData) 
    { 
     if (imageData == null || imageData.Length == 0) return null; 
     var image = new BitmapImage(); 
     using (var mem = new MemoryStream(imageData)) 
     { 
      mem.Position = 0; 
      image.BeginInit(); 
      image.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      image.UriSource = null; 
      image.StreamSource = mem; 
      image.EndInit(); 
     } 
     image.Freeze(); 
     return image; 
    } 
Image img = new Image(); 
img.Source = LoadImage(Item._image); // for example 
+0

Я действительно имею дело с ModelView Class для элементов ListView WPF, ваше решение работает только с winforms. –

+0

Почему вы так говорите! «img» - это управление изображениями в WPF? – HICURIN

+0

да его управление изображением в wpf, которое ограничено свойством «Значок» типа «ImageSource» –

1

Что является основной тип пункта в строке:

public void Assign(object item) 

например что вы видите, если вы запускаете MessageBox.Show (item.GetType()).

Если х равна нулю после

ItemEx x = item as ItemEx; //its still null 

затем элемент не типа ItemEx. Предполагаю, что вы отправляете ItemEx из Клиента; иначе это не сработает. Также обратите внимание, что _image является частным элементом Item, поэтому вы не сможете получить к нему доступ в ItemEx, если вы не измените базовый класс.

Вы знаете, почему остальные три свойства «Пункт» класса подвергаются через свойства, тогда как «изображение» не является. Кажется, это проблема.

+0

его null, и у меня есть тот же код, который я размещаю в этом вопросе: \ –

+0

Что такое null? Вы говорите, что элемент имеет значение null? item.GetType() не может быть нулевым. – StevieB

+0

Если элемент был создан («новый» ed/created) в качестве элемента, он никогда не может быть напрямую привязан к элементу ItemEx, потому что он не является и никогда не был объектом этого типа. Подумайте о создании конструктора для вашего класса ItemEx, который принимает параметр типа Item и внутри него, выполняет поэтапное присвоение для копирования по всем значениям. – Zenilogix

Смежные вопросы