2014-12-04 7 views
0

사용자가 뷰에서 이미지를로드 할 수있게하려고합니다.Caliburn.Micro를 사용하여 viewmodel의 이미지를보기로로드하십시오.

내 주요보기 :

<UserControl x:Class="TestApplication.Views.MainView" 
      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" 
      mc:Ignorable="d"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="0.3*" /> 
     </Grid.ColumnDefinitions> 

     <Image 
      Grid.Column="0" 
      Stretch="Uniform" 
      x:Name="Preview"> 
      <Image.Source> 
       <BitmapImage UriSource="pack://application:,,,/Resources/placeholder.jpg" /> 
      </Image.Source> 
     </Image> 

     <ContentControl 
      Grid.Column="1" 
      x:Name="ImageManagement" /> 

    </Grid> 
</UserControl> 

내 주요 뷰 모델 :

namespace TestApplication.ViewModels 
{ 
    using System; 
    using System.ComponentModel.Composition; 
    using System.Windows.Controls; 
    using Caliburn.Micro; 
    using PropertyChanged; 
    using TestApplication.Events; 

    [ImplementPropertyChanged] 
    [Export(typeof(MainViewModel))] 
    public class MainViewModel : PropertyChangedBase, IHandle<FileSelectedEvent> 
    { 
     private readonly IEventAggregator events; 

     [ImportingConstructor] 
     public MainViewModel(IEventAggregator events) 
     { 
      this.events = events; 
      this.events.Subscribe(this); 

      this.ImageManagement = new ImageManagementViewModel(events); 
     } 

     public ImageManagementViewModel ImageManagement { get; set; } 

     public Image Preview { get; set; } 

     public void Handle(FileSelectedEvent message) 
     { 
      // load the selected image 
     } 
    } 
} 

이미지 자리 표시가 표시되지 않으며, 스눕도 표시되지 않습니다. BitmapImage 인스턴스화하고 Handle 방법에서 Preview.Source으로 설정하여 이미지를로드 할 때

게다가, ... Preview 속성은 널 (null)이며, I는 먼저 초기화하면, 어느 표시 결코.

PropertyChanged는 Fody를 통해 처리됩니다.

+0

자리 표시 자 아마 잘못된 URI입니다이로 전환이 문제를 해결했다. 당신을 위해 그것을 디버깅 할 수 없습니다. 미리보기는 포함 된 코드의 어떤 것에도 바인딩되지 않으므로이 마법이 어떻게 작동하는지 확신 할 수 없습니다. – Will

+0

Image의 기본 규칙은 Source 속성에 있고 Loaded에 의해 트리거됩니다. 이미지를 URI 또는 ​​문자열 값으로 설정해야하며 실제 이미지 컨트롤이 필요하지는 않습니다. – mvermef

+0

나는 @Will이 패키지 uri에 관해서 옳다고 생각한다. 나는 당신이 그것을 시작할 필요가 있다고 생각하지 않는다. 그냥 일단 속성 변경이 트리거되면 관습에 따라 바인드해야 소스를''Image x : Name = "Preview"Fill = "Uniform"Source = "/ Resources/placeholder.jpg"/>''로 설정하십시오. – mvermef

답변

0

@Will과 @mvermef 덕분에 대답을 찾았습니다.

자리 표시 자 URL이 유효하지 않지만 pack:// 부분없이 작동합니다. 나는 그것을 좋아하지 만, 그 이유는 그것이 파일이 아니라 자원이라는 것이 명백하기 때문입니다.

실제 문제는 실제로 Caliburn.Micro가 컨트롤에 바인딩되지 않고 Source 속성에 바인딩된다는 것입니다.

<Image 
     Grid.Column="0" 
     Stretch="Uniform" 
     Source="{Binding PreviewUrl}" /> 

와 뷰 모델 :

[ImportingConstructor] 
    public MainViewModel(IEventAggregator events) 
    { 
     this.events = events; 
     this.events.Subscribe(this); 

     this.ImageManagement = new ImageManagementViewModel(events); 
     this.PreviewUrl = "pack://application:,,,/Resources/placeholder.jpg"; 
    } 

    public String PreviewUrl { get; set; } 

    public void Handle(FileSelectedEvent message) 
    { 
     this.PreviewUrl = message.FilePath; 
    }