Ala*_*aa' 4 browser wpf command mvvm
我有一个选项卡控件包含两个选项卡,一个显示正在运行的进程的消息,另一个向我显示一个网页!
当我按下开始流程运行并显示消息时,我有三个按钮(启动,停止和清除).
我需要的是我按下开始按钮,两个标签,显示我所需的内容.这意味着我需要两个绑定两个命令到同一个按钮
你知道怎么绑定1个按钮两个命令吗?
我正在使用MVVM,而且我是MVVM的新手.
<Button Content="Start" Command="{Binding StartProcess_Command }" Height="25" Width="60" Grid.Row="0" Grid.Column="0" Margin="10"/>
<Button Content="Stop" Command="{Binding StopProcess_Command}" Height="25" Width="60" Grid.Row="0" Grid.Column="1" Margin="10"/>
<Button Content="Clear" Command="{Binding ClearBtn_Command}" Height="25" Width="60" Grid.Row="0" Grid.Column="2" Margin="10"/>
<telerik:RadTabControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1" Grid.ColumnSpan="4" Margin="10">
<telerik:RadTabItem Header="Maestro" IsSelected="{Binding Path=MaestroSelected}">
<ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible">
<local:WPFBrowser/>
</ScrollViewer>
</telerik:RadTabItem>
<telerik:RadTabItem Header="Messages">
<Grid Background="LightGray">
<ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible">
<TextBlock TextWrapping="Wrap" Text="{Binding Path=output_process,UpdateSourceTrigger=Default}"/>
</ScrollViewer>
</Grid>
</telerik:RadTabItem>
</telerik:RadTabControl >
Run Code Online (Sandbox Code Playgroud)
这是WPFBrowser.cs代码:
public WPFBrowser()
{
ServerString = "localhost"; //defualt value
PortString = "9999"; //default value
this.refreshCommand = new Lunch_Maestro.ViewModel.Command(DoRefreshCommand);
m_WPFBrowser = new WebBrowser()
{
HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
VerticalAlignment = System.Windows.VerticalAlignment.Stretch
};
m_WPFBrowser.Navigated += WPFBrowser_Navigated;
this.Content = m_WPFBrowser;
}
private void WPFBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
this.HideScriptErrors(m_WPFBrowser, true);
}
/// <summary>
/// Found this link with interesting scenerios for script erros...
/// http://social.msdn.microsoft.com/Forums/vstudio/en-US/4f686de1-8884-4a8d-8ec5-ae4eff8ce6db/new-wpf-webbrowser-how-do-i-suppress-script-errors?forum=wpf
/// </summary>
public void HideScriptErrors(WebBrowser wb, bool Hide)
{
FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
if (fiComWebBrowser == null) return;
object objComWebBrowser = fiComWebBrowser.GetValue(wb);
if (objComWebBrowser == null) return;
objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide });
}
private void DoRefreshCommand()
{
m_WPFBrowser.Navigate(new Uri("http://" + ServerString + ":" + PortString + "/"));
}
private bool _maestroSelected;
public bool MaestroSelected
{
get { return _maestroSelected; }
set
{
_maestroSelected = value;
if (_maestroSelected == true)
m_WPFBrowser.Navigate(new Uri("http://" + ServerString + ":" + PortString + "/"));
OnPropertyChanged("MaestroSelected");
}
}
private readonly WebBrowser m_WPFBrowser;
private string _serverString;
public string ServerString
{
get { return _serverString; }
set
{
_serverString = value;
OnPropertyChanged("ServerString");
}
}
private string _portString;
public string PortString
{
get { return _portString; }
set
{
_portString = value;
OnPropertyChanged("PortString");
}
}
private Lunch_Maestro.ViewModel.Command refreshCommand;
public Lunch_Maestro.ViewModel.Command RefreshCommand
{
get { return refreshCommand; }
}
// and Inotify property changes here
Run Code Online (Sandbox Code Playgroud)
Jos*_*eph 13
您可以像这样调用多个命令:
// xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
<Button>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding Cmd1}" />
<i:InvokeCommandAction Command="{Binding Cmd2}" />
<i:InvokeCommandAction Command="{Binding Cmd3}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
Run Code Online (Sandbox Code Playgroud)
如果您需要的话,这还允许您控制命令执行顺序
PS:您只需要安装Microsoft.Xaml.Behaviors.WpfNuGet包即可。
你想点击一个Button并运行两段代码......它听起来真的不那么复杂.使用其中一个可用的RelayCommands,问题可以修复如下:
public ICommand SomeCommand
{
get { return new ActionCommand(action) => { RunFirstFunction(action);
RunSecondFunction(action) }, canExecute => someCondition); }
}
Run Code Online (Sandbox Code Playgroud)
在XAML中:
<Button Command="{Binding SomeCommand}" CommandParameter="{Binding SomeObject}">
Click Me
</Button>
Run Code Online (Sandbox Code Playgroud)
ActionCommand是我自己的形式RelayCommand,但所有的delegate ICommand实现都大致相同,可以这样工作.该CommandParameter值作为action变量进入代码并传递给两个函数.
您可以使用Prism框架中的CompositeCommand。在视图模型中创建一个附加的 CompositeCommand,使用此 CompositeCommand 注册两个普通命令并将按钮绑定到该 CompositeCommand。
有关如何使用 CompositeCommands 的信息,请参阅第 130 页的Prism 文档。
您的应用程序需要引用 Prism 包中包含的 Microsoft.Practices.Prism.dll。
| 归档时间: |
|
| 查看次数: |
11944 次 |
| 最近记录: |