2016-12-23 3 views
0

Я пытаюсь связать Source свойство Image управления через XAML. Но ничего не отображается в моем элементе управления Image.свойство связывания «Source» управления Image не работает

XAML:

<Window x:Class="ImageSourceBinding.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"> 
    <StackPanel> 
     <Image Name="MyImage1" Width="32" Height="32" Source="{Binding MyImageSource}"/> 
     <Image Name="MyImage2" Width="32" Height="32" /> 
    </StackPanel> 
</Window> 

Код За:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    ImageSource MyImageSource; 
    String  FilePath = @"C:\Users\UserName\Documents\Map.txt"; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 

     System.Drawing.Icon ExtractedIcon = System.Drawing.Icon.ExtractAssociatedIcon(FilePath); 
     MyImageSource = Imaging.CreateBitmapSourceFromHIcon(ExtractedIcon.Handle, new Int32Rect(0, 0, 32, 32), BitmapSizeOptions.FromEmptyOptions()); 
     ExtractedIcon.Dispose(); 

     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("MyImageSource")); 

     this.Icon  = MyImageSource; //This is Working 
     //MyImage2.Source = MyImageSource; //and this too. 
    } 
} 

я могу использовать MyImageSource изменить значок окна. Кроме того, если я установил Source from Code-Behind, изображение будет правильно отображено.

ответ

4

Поскольку вы используете PropertyChanged и, по-видимому, правильный контекст данных, я предполагаю, что ваше связывание получает уведомление об изменении MyImageSource, но просто не может получить к нему доступ, поскольку MyImageSource является частным и не является собственностью.

Попробуйте использовать эту функцию, чтобы определить MyImageSource:

public ImageSource MyImageSource { get; private set; } 
+0

У меня есть Исключение. – Gaurav

+0

У меня есть Исключение. [System.Windows.Markup.XamlParseException] \t {"'Вызов конструктора типа' ImageSourceBinding.MainWindow ', который соответствует указанным ограничениям привязки, сделал исключение.' Номер строки «3» и позиция линии «9». » – Gaurav

+0

Есть ли какое-либо внутреннее исключение? XamlParseException появляется на исключениях в конструкторе окна WPF, так что это может быть действительно что угодно. –

1

Вы не можете связать с полем, только свойства. Напишите свойство, подобное этому, и просто присвойте этому свойству код:

private ImageSource _myImageSource; 
public ImageSource MyImageSource { 
    get { return _myImageSource; } 
    set { 
     if (value != _myImageSource) 
     { 
      _myImageSource = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MyImageSource))); 
     } 
    } 
} 

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 

    System.Drawing.Icon ExtractedIcon = System.Drawing.Icon.ExtractAssociatedIcon(FilePath); 
    MyImageSource = Imaging.CreateBitmapSourceFromHIcon(ExtractedIcon.Handle, new Int32Rect(0, 0, 32, 32), BitmapSizeOptions.FromEmptyOptions()); 
    ExtractedIcon.Dispose(); 

    this.Icon  = MyImageSource; //This is Working 
} 

Теперь ваша привязка должна работать.

DataContext = this; не рекомендуется. Предпочтительно иметь отдельный класс viewmodel. Но это не убьет тебя однажды.