2011-10-12 3 views
1

MVVM으로 변환하는 Silverlight 프로젝트가 있습니다. 그 패턴을 사용하는 것은 처음이고, 나는 무엇인가 고투하고 있습니다.Silverlight를 MVVM으로 변환하는 경우 몇 가지 문제가 있습니다.

그래서 기본적으로 내가 페이지 뒤에 XAML 코드에서이 있었다 :

OpenFileDialog ofd = new OpenFileDialog(); 
      if ((bool)ofd.ShowDialog()) 
      { 
       _fileName = ofd.File.Name; 
       FileStream fs = ofd.File.OpenRead(); 
       fileSize = (double)fs.Length; 
       txtFileName.Text = fileName; 
       index = 0; 
       sendData = 0; 

       byte[] file = new byte[fs.Length]; 
       fs.Read(file, 0, file.Length); 
       //convertToChunks(file); 

       prgUpload.Maximum = fileChunks.Count; 
       prgUpload.Value = 0; 
       //uploadChunks(index); 
      } 

내가 모델에 그것을 사용할 수 있도록 그것을 연결할 방법을 알아낼 수 없습니다? 뷰 모델이 작동한다고 가정하지만 아무 것도 작동하지 않습니다.

의견이 있으십니까?

<Grid x:Name="LayoutRoot" Width="475" Height="340"> 
    <Canvas Margin="8,8,0,0" Background="White" Height="320" VerticalAlignment="Top" HorizontalAlignment="Left" Width="475"> 
     <Button Width="75" Canvas.Left="380" Canvas.Top="43" Content="Browse" x:Name="btnBrowse" /> 
     <TextBox Canvas.Left="25" IsReadOnly="True" Canvas.Top="43" TextWrapping="Wrap" Width="350" Text="{Binding Path=FileUploadName}" x:Name="txtFileName" /> 
     <ProgressBar Height="10" Width="350" Canvas.Left="25" Canvas.Top="99" x:Name="prgUpload" /> 

     <my:Label Content="Please select a file to upload" Name="lblError" Canvas.Left="25" Canvas.Top="23" RenderTransformOrigin="0.133,-0.063" Width="220"/> 
     <my:Label x:Name="lblProgress" Canvas.Left="25" Canvas.Top="78" RenderTransformOrigin="0.133,-0.063" Width="220"/> 
    </Canvas> 
</Grid> 

는 기본적으로 나는 사용자가 업로드 할 파일을 선택 후 화재하려는 : 여기

가 진행 XAML의 작품입니다.

+0

이벤트를 시작 하시겠습니까? 보기 모델 –

+0

과 연결된 와이어 링 위치에서 XAML을 추가 할 수 있습니까? 모델이있는 ViewModels에 뷰가 바인딩됩니다. View에서 보낸 데이터로 ViewModel을 통해 새 Model을 생성하려고한다고 생각합니다. – SQLMason

+0

보기 -> viewmodel -> 모델을 이해합니다. 하지만 구문을 이해하지 못하거나 모든 것을 작동시키지 못합니다. 누군가가 나에게 각 단계에 대한 모범을 줄 수 있기를 바랬다. – PixelMuse

답변

2

당신이 명령을 발사하려는 경우에 당신의 ViewModel

public ICommand OpenFileCommand { get; set; } 

    public MainViewModel() 
    { 
     OpenFileCommand = new RelayCommand(OpenDialog) { IsEnabled = true }; 

    } 

    private void OpenDialog() 
    { 
     OpenFileDialog ofd = new OpenFileDialog(); 
     if ((bool)ofd.ShowDialog()) 
     { 
      _fileName = ofd.File.Name; 
      FileStream fs = ofd.File.OpenRead(); 
      fileSize = (double)fs.Length; 
      //txtFileName.Text = fileName;// Apply Binding 
      index = 0; 
      sendData = 0; 

      byte[] file = new byte[fs.Length]; 
      fs.Read(file, 0, file.Length); 
      //convertToChunks(file); 

      prgUpload.Maximum = fileChunks.Count; 
      prgUpload.Value = 0; 
      //uploadChunks(index); 
     } 
    } 

예를

partial class MainWindow 
{ 
    public MainWindow() 
    { 
    InitializeComponent(); 
    this.DataContext=new MainViewModel(); 
    } 
} 

과의 생성자 뒤에 코드에서 당신

<Button Width="75" Canvas.Left="380" Canvas.Top="43" Content="Browse" x:Name="btnBrowse" 
    Command={Binding OpenFileCommand} /> 

의 작업을 할 것 그리고 RelayCommand

public class RelayCommand:ICommand 
{ 
    private bool _isEnabled; 
    public bool IsEnabled 
    { 
     get { return _isEnabled; } 
     set 
     { 
      if (value != _isEnabled) 
      { 
       _isEnabled = value; 
       if (CanExecuteChanged != null) 
       { 
        CanExecuteChanged(this, EventArgs.Empty); 
       } 
      } 
     } 
    } 
    private Action _handler; 
    public RelayCommand(Action handler) 
    { 
     _handler = handler; 
    } 


    public bool CanExecute(object parameter) 
    { 
     return IsEnabled; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     _handler(); 
    } 
} 

텍스트 상자에 파일 이름을 가져 오려면 텍스트 상자를 뷰 모델에 바인딩해야합니다. UI에 나타나고 또한 INotifyPropertyChanged를 구현합니다. 또한 이것을 보면 도움이 될 것입니다 Silverlight MVVM

+0

그것은 가장 뛰어납니다. 시간 내 주셔서 감사합니다. – PixelMuse

관련 문제