Почему эта привязка не работает в MVVM? - PullRequest
1 голос
/ 27 апреля 2011

Я устанавливаю привязку к объекту ViewModel из WPF View, но привязка, похоже, не срабатывает. Я не проделал большую работу в MVVM, поэтому я решил спросить, есть ли причина, по которой привязка к свойству источника изображения не срабатывает при загрузке страницы.

Вот XAML страницы:

<Page x:Class="DallasPrintManager.PrintPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:viewmodel="clr-namespace:DallasPrintManager.ViewModel"
  mc:Ignorable="d" 
  d:DesignHeight="300" d:DesignWidth="900"
  DataContext="{Binding Main, Source={StaticResource PrintPage}}">
<Grid >
    <Grid.ColumnDefinitions>
        <ColumnDefinition  />
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Image Source="{Binding ImageDisplay}" />
    </ScrollViewer>
</Grid>
</Page>

А вот ViewModel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Media.Imaging;
using System.Drawing;
using System.Windows.Input;
using DallasPrintManager.Commands;
using System.Net;
using System.IO;
using System.Windows;

public class PrintPageViewModel : INotifyPropertyChanged
{
    private BitmapImage _imageDisplay;

    public PrintPageViewModel()
    {
        ImageDisplay = getImage();
    }

    private BitmapImage getImage()
    {
        try
        {
            WebClient wc = new WebClient();
            byte[] imageData = wc.DownloadData("http://localhost/TestImage.tif");
            MemoryStream ms = new MemoryStream();
            ms.Write(imageData, 0, imageData.Length);
            System.Windows.Media.Imaging.BitmapImage wpfImg = new System.Windows.Media.Imaging.BitmapImage();
            wpfImg.BeginInit();
            wpfImg.StreamSource = ms;
            wpfImg.EndInit();
            return wpfImg;
            //return (Bitmap)Bitmap.FromStream(ms);
        }
        catch (WebException e)
        {
            MessageBox.Show("Error fetching document:\n\n" + e.Message);
            return null;
        }
        catch (Exception e)
        {
            if (e.Source == "System.Drawing")
                MessageBox.Show("Error reading document.");
            Console.Out.Write(e);
            return null;
        }
    }

    public BitmapImage ImageDisplay
    {
        get
        {
            return _imageDisplay;
        }
        set
        {
            if (value != _imageDisplay)
            {
                _imageDisplay = value;
                OnPropertyChanged("ImageDisplay");
            }
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
        }
    }

}

Модель представления создается в app.xaml и привязывается к странице печати. ​​

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

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

0 голосов
/ 28 марта 2018

Если окно вывода отладки не отображается, вы можете включить его с помощью CTRL + Alt + O .

Для получения дополнительной информации добавьтеxmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase" внутри вашего XAML и diag:PresentationTraceSources.TraceLevel=High для вашей привязки:

<Page x:Class="DallasPrintManager.PrintPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:viewmodel="clr-namespace:DallasPrintManager.ViewModel"
  xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
  [...]
  DataContext="{Binding Main, Source={StaticResource PrintPage}}">

и:

<Image Source="{Binding ImageDisplay, diag:PresentationTraceSources.TraceLevel=High}" />

Вы также должны убедиться, что ваши свойства привязок реализуют INotifyPropertyChanged, еслипривязки используют UpdateSourceTrigger=PropertyChanged.В противном случае они не будут обновляться.

Вы даже можете создать dummyConverter:

public class DebugDummyConverter : IValueConverter
    {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                    Debugger.Break();
                    return value;
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                    Debugger.Break();
                    return value;
            }
    }

и добавить его в привязку Converter={StaticResource DebugDummyConverter}, чтобы получить информацию о значении привязки, но это толькоработает, если привязка установлена ​​правильно, иначе вы не получите никакой информации.

Подробнее см. http://www.wpf -tutorial.com / data-binding / debugging / .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...