Может быть, глупый вопрос, но я больше не знаю ...

У меня есть такой класс ViewModel:

public class MainWindowsViewModel : INotifyPropertyChanged
{
    private ImageSource _img;
    public ImageSource StatusImage
    {
        get { return _img; }
        set
        {
            _img = value;
            NotifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName]String propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Привязка в XAML выглядит так:

  <Window.DataContext>
    <VM:MainWindowsViewModel />
  </Window.DataContext>
    <Image x:Name="gui_image_status" HorizontalAlignment="Left" Height="26" Margin="144,10,0,0" VerticalAlignment="Top" Width="29" Source="{Binding Path=StatusImage}" />

И я установил содержимое ImageSource следующим образом:

MainWindowsViewModel _view = new MainWindowsViewModel();

        var yourImage = new BitmapImage(new Uri(String.Format("Sources/{0}.png", "red"), UriKind.Relative));
        _view.StatusImage = yourImage;

Но это не работает. Я думаю, что проблема в этом NotifyPropertyChanged, потому что я попытался разместить тормозную точку в set и get. Get запускался несколько раз вначале, после этого set также запускался с правильным ImageSource, но после этого get больше не запускался. Как будто никакой настройки никогда не было.

Это действительно просто обязывает, что я делал много раз аналогичным образом ... Я не знаю, почему на этот раз не работает.

1
GrowSing 5 Янв 2016 в 19:45

2 ответа

Лучший ответ

Вы создаете два экземпляра своего класса MainWindowsViewModel, один в XAML с помощью

<Window.DataContext>
    <VM:MainWindowsViewModel />
</Window.DataContext>

И один в коде позади

MainWindowsViewModel _view = new MainWindowsViewModel();

Таким образом, ваш код устанавливает свойство для экземпляра модели представления, отличного от того, к которому привязано представление.

Измените свой код на это:

var viewModel = (MainWindowsViewModel)DataContext;
viewModel.StatusImage = new BitmapImage(...);
3
Clemens 5 Янв 2016 в 17:13

Я не обнаружил проблем в вашем коде, но вы можете попробовать кое-что проверить.

  1. Убедитесь, что ваше изображение добавлено в проект, и установите действие сборки изображений на Content (скопируйте, если новее).
  2. Перед обновлением ImageSource вызовите метод Freeze, чтобы предотвратить ошибку: «Необходимо создать DependencySource в том же потоке, что и DependencyObject»

    var yourImage = new BitmapImage(new Uri(String.Format("Sources/{0}.png", "red"), UriKind.Relative));
    yourImage.Freeze();
    _view.StatusImage = yourImage;
    

Кроме того, есть более простой способ привязать изображение в WPF. Вы можете использовать строку в качестве источника и установить путь ресурса к привязанному свойству:

public string StatusImage  
{
    get { return "/AssemblyName;component/Sources/red.png"; }
}
0
Vadim Martynov 5 Янв 2016 в 16:59