2015-05-05 4 views
0

У меня есть форма с компонентом изображения. Я хотел бы загрузить изображение во время выполнения. В моей ViewModel, я имею свойство, которое представляет путь источника изображения:Заблокировать привязку данных MVVM

public string ImagePath { get; set; } 

Это свойство является обязательным для Источника моего ImageComponent. Проблема заключается в том, что при запуске приложения ImagePath имеет значение null, а конвертер по умолчанию пытается конвертировать ImagePath в System.Windows.Media.ImageSource и создавать исключение.

Я думал, 3 решения:
- Создание пользовательского преобразователя (который может дать ImageSource по умолчанию, когда строка является нулевой)
- Препятствовать вид, чтобы получить ImagePath (Не знаю, как)
- Использование a System.Windows.Media.ImageSource вместо строки. (не уверен, что шаблон MVVM соответствует запросу System.Windows.Media используется только в представлении)

Итак, мой вопрос: какое решение лучше (не только мое 3) и какова будет реализация?

Часть XAML Переплет:

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <Image Name="image" Stretch="Uniform" Source="{Binding Main.ImagePath, Mode=OneWay, Source={StaticResource Locator}}" /> 
</ScrollViewer> 

Исключение, поднятый:

System.Windows.Data Error: 23 : Cannot convert '' from type 'String' to type 'System.Windows.Media.ImageSource' for 'en-US' culture with default conversions; 
+2

Можете ли вы добавить Control + Binding, который вы используете в XAML? – Staeff

+0

Я отредактировал мой вопрос, спасибо – Epitouille

+0

Хм, странно, я не получаю эту ошибку, независимо от того, установил ли я ImagePath значение «null», «» «», допустимый или недопустимый путь ... может быть, потому что я не использую ViewModelLocator, я также попробую это – Staeff

ответ

2

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

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
    <Image Name="image" Stretch="Uniform" Source="{Binding Main.ImagePath, TargetNullValue={x:Null}, Mode=OneWay, Source={StaticResource Locator}}" /> 
</ScrollViewer> 

Кроме того вы можете указан путь по умолчанию в TargetNullValue, если вы хотите.

-1

Я только начал проект ваниль MVVM Light (.NET 4.5), и добавил следующие вещи, чтобы мой код и я не получаю ошибку, которую вы описываете.

MainViewModel:

public class MainViewModel : ViewModelBase 
{ 
    public string ImagePath 
    { 
     get 
     { 
      return _imagePath; 
     } 
     set 
     { 
      _imagePath = value; 
      RaisePropertyChanged(() => ImagePath); 
     } 
    } 
    private string _imagePath; 

    public RelayCommand ImageCommand 
    { 
     get 
     { 
      return _imageCommand ?? 
       (_imageCommand = new RelayCommand(() => ImagePath = "Image.png")); 
     } 
    } 
    private RelayCommand _imageCommand ; 

    public MainViewModel() 
    { 
     // I've tried both of those and it still works 
     //ImagePath = ""; 
     //ImagePath = null; 
    } 
} 

MainWindow Содержание XAML:

<StackPanel> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" 
        VerticalScrollBarVisibility="Auto"> 
     <Image x:Name="TestImage" 
       Source="{Binding Main.ImagePath, 
           Mode=OneWay, 
           Source={StaticResource Locator}}" 
       Stretch="Uniform" /> 
    </ScrollViewer> 

    <Button Command="{Binding Main.ImageCommand, 
           Source={StaticResource Locator}}" 
      Content="Click" /> 
</StackPanel> 
Смежные вопросы