2011-10-12 69 views
1

我有一个Silverlight项目转换为MVVM。这是我第一次使用这种模式,并且我正在努力应对某些事情。将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); 
      } 

我无法弄清楚如何连接起来,以便能够使用模型?我认为视角模型发挥作用,但没有任何工作。

有什么想法?

这里正在进行XAML的工作:

<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> 

基本上我希望它激发用户选择要上传的文件后。

+0

当你想发射事件?你可以添加你的XAML在你想要连接视图模型 –

+0

视图绑定到ViewModels有一个模型。我相信你想通过你的ViewModel生成一个新的模型,并从你的视图发送数据。 – SQLMason

+0

我了解视图 - > viewmodel - >模型。但我只是没有得到语法或某些东西来完成这一切。希望有人能够在每个阶段给我一个例子。 – PixelMuse

回答

2

如果你想火的命令,这将做你

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

的工作在后面的构造你的代码,例如

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

,并在您的视图模型

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); 
     } 
    } 

和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