Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将CommandParameter与RelayCommand一起使用?_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何将CommandParameter与RelayCommand一起使用?

C# 如何将CommandParameter与RelayCommand一起使用?,c#,wpf,mvvm,C#,Wpf,Mvvm,我还在学习MVVM和WPF的诀窍,目前我正在尝试使用MVVM创建一个Mediaplayer。在谷歌搜索之后,我决定使用CommanParameter是避免代码落后的最好方法。我认为代码和XAML看起来不错,但没有什么神奇之处——也就是说什么都没有发生 有没有善良的灵魂会介意看看我的代码并给我一些建议?和往常一样,我真的很重视你的答案。请忽略我在RelayCommands中的复数,时间不早了:) XAML <MediaElement Name="MediaElement" Sour

我还在学习MVVM和WPF的诀窍,目前我正在尝试使用MVVM创建一个Mediaplayer。在谷歌搜索之后,我决定使用CommanParameter是避免代码落后的最好方法。我认为代码和XAML看起来不错,但没有什么神奇之处——也就是说什么都没有发生

有没有善良的灵魂会介意看看我的代码并给我一些建议?和往常一样,我真的很重视你的答案。请忽略我在RelayCommands中的复数,时间不早了:)

XAML

<MediaElement Name="MediaElement" 
    Source="{Binding VideoToPlay}" 
    Width="400" Height="180" Stretch="Fill"
    LoadedBehavior="Manual" UnloadedBehavior="Manual"/>
<Slider Name="timelineSlider" Margin="5" Width="250" 
    HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button 
    Command="{Binding PlayMediaCommand}" 
    CommandParameter="{Binding ElementName=MediaElement, Mode=OneWay}">&lt;&lt;</Button>

C#

class MediaPlayServiceWModel:INotifyPropertyChanged
{
私有媒体元素MyMediaElement;
私有Uri(视频播放),;
公共Uri视频播放
{
获取{return\u videoToPlay;}
设置
{
_视频播放=值;
OnPropertyChanged(“视频播放”);
}
}
void SetMedia()
{
OpenFileDialog dlg=新建OpenFileDialog();
dlg.InitialDirectory=“c:\\”;
dlg.Filter=“媒体文件(*.wmv)|*.wmv|所有文件(*.*)|*.”;
dlg.RestoreDirectory=true;
if(dlg.ShowDialog()==true)
{
VideoToPlay=新Uri(dlg.FileName);
}
}
RelayCommands\u openFileDialogCommand;
公共ICommand OpenFileDialogCommand
{
得到
{
如果(_openFileDialogCommand==null)
{
_openFileDialogCommand=new relayCommand(p=>SetMedia(),
p=>true);
}
返回openFileDialogCommand;
}
}
RelayCommands_playmedia命令;
公共ICommand PlayMediaCommand
{
得到
{
如果(_playMediaCommand==null)
{
_playMediaCommand=新的RelayCommand(p=>PlayMedia(p),
p=>true);
}
return\u playmedia命令;
}
}
无效播放媒体(对象参数)
{
var paramMediaElement=(MediaElement)param;
MyMediaElement=paramMediaElement;
MyMediaElement.Source=VideoToPlay;
MyMediaElement.Play();
}
受保护的无效OnPropertyChanged(字符串propertyname)
{
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这是新的PropertyChangedEventArgs(propertyname));
}
公共事件属性更改事件处理程序属性更改;
类中继命令:ICommand
{
私有只读谓词_canExecute;
私有只读操作\u执行;
公共事件处理程序CanExecuteChanged;
公共中继命令(操作执行)
:此(执行,空)
{}
公共中继命令(操作执行,
谓词(可执行)
{
_执行=执行;
_canExecute=canExecute;
}
公共布尔CanExecute(对象参数)
{
如果(_canExecute==null)
{
返回true;
}
返回_canExecute(参数);
}
public void Execute(对象参数)
{
_执行(参数);
}
public void raisecancecutechanged()
{
如果(CanExecuteChanged!=null)
{
CanExecuteChanged(此为EventArgs.Empty);
}
}
}

设置属性
VideoToPlay
后,示例代码即可正常工作。是否确实要设置此属性?您的XAML代码片段未使用设置此属性的
OpenFileDialogCommand

<Button Content="Select File" Command="{Binding OpenFileDialogCommand}" />


我假设您已经在视图上设置了数据上下文?是的,我设置了:)它设置为窗口我在顶部菜单中使用了该命令,我忘了在代码中显示:)但它在那里。我仍然无法使用播放按钮播放视频。哦,天哪,我刚刚意识到我做错了什么……该命令在错误的按钮上。很高兴听到您的声音修复了您的问题。如果上述答案帮助您达到目标,请接受:)
<Button Content="Select File" Command="{Binding OpenFileDialogCommand}" />