使用mvvm模式从父窗口引发usercontrol命令

时间:2015-10-14 06:35:47

标签: wpf xaml mvvm-light

我的WCF应用程序支持从远程服务下载书籍。用户向服务发送下载书籍的请求,该服务获取请求并下载书籍。作为响应,它发送所请求书籍的下载进度。 BookContainer中的每个元素都是Book.xaml的userControl,其逻辑由bookviewmodel.cs类表示。 当用户单击BookContainer.xaml窗口中的每个book元素时,bookviewmodel中的click命令将按预期引发。 我需要帮助来实施" DownlaodAllCommand"在containerviewmodel里面提出每本书的每个DownloadCommand。 应该如何使用mvvm模式实现。

BookContainer视图: https://onedrive.live.com/redir?resid=3A8F69A0FB413FA4!124&authkey=!ANdfYAk6f0Vf-8s&v=3&ithint=photo%2cpng

代码背后: BookContainer.xaml:

<Window x:Name="BookContainer"
DataContext="{Binding Source={StaticResource Locator}, Path=ContainerViewModel}">
<DockPanel>
        <ItemsControl DockPanel.Dock="Top" ItemsSource="{Binding Books}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate >
                    <Controls:BookControl   />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

        <Button DockPanel.Dock="Bottom" Command="{Binding DownloadAllCommand}" Content="Download All" > </Button>
    </DockPanel>
</Window>

ContainerViewModel

public class ContainerViewModel : ViewModelBase
    {
        private ObservableCollection<BookViewModel> books;
        public ObservableCollection<BookViewModel> Books
        {
            get
            {
                if (books == null)
                {
                    // Not yet created.
                    // Create it.
                    books = new ObservableCollection<BookViewModel>();
                }

                return books;
            }
        }

        private ActionCommand _DownloadAllCommand;
        public ICommand DownloadAllCommand
        {
            get
            {
                if (_DownloadAllCommand == null)
                {
                    _DownloadAllCommand = new ActionCommand(OnDownloadAllCommand, CanDownloadAllCommand);
                }
                return _DownloadAllCommand;
            }
        }

        private void OnDownloadAllCommand()
        {
           // help ! 

        }

        private bool CanDownloadAllCommand()
        {
            return true;
        }
    }

Book.xaml

<UserControl
  <Label Grid.Row="0">Title</Label>
        <Label Grid.Row="1">Author</Label>
        <Label Grid.Row="2">Description</Label>

        <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Title}"/>
        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Author}"/>
        <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Description}"/>
        <Button Grid.Column="2" Grid.RowSpan="3" Command="{Binding DownloadCommand}" Content="Download" />


        <Ellipse   Grid.Column="3" 
                    Height="20" Width="20"  
                    Stroke="Black" 
                    StrokeThickness="0.5" 
                    HorizontalAlignment="Center" 
                   Grid.Row="1"
                    />
        <Controls:PieSlice Grid.Column="3" Grid.Row="1" Stroke="Black" Fill="Black" 
                             Height="20" Width="20" 
                             StartAngle="0" EndAngle="{Binding Percent}"
                             HorizontalAlignment="Center" />

</UserControl>

BookViewModel

  public class BookViewModel : ViewModelBase
{
    public delegate void DownloadRequest(string name);
    public event DownloadRequest OnDownalodRequest;

    public BookViewModel(BookModel model)
    {
        this.Book = model;
    }
    private ActionCommand _DownloadCommand;
    public ICommand DownloadCommand
    {
        get
        {
            if (_DownloadCommand == null)
            {
                _DownloadCommand = new ActionCommand(OnDownloadCommand, CanDownloadCommand);
            }
            return _DownloadCommand;
        }
    }
    protected virtual void OnDownloadCommand()
    {
        if (OnDownalodRequest != null)
        {
            OnDownalodRequest.Invoke(this.Author);
        }
    }
}

BookModel

public class BookModel
    {
        public string Title { get; set; }
        public string Author { get; set; }
        public string Description { get; set; }
        public Status Status { get; set; }
    }

1 个答案:

答案 0 :(得分:0)

Insid ContainerViewModel,方法OnSaveAllCommand():

Cookie[]

但请注意,使用来自其他viewmodel的viewmodel是一种不好的做法,尝试在模型级别上执行viewmodels通信。