我对Command绑定没什么新意,所以对许多人来说这可能是一个微不足道的问题。我知道我们可以在窗口的xaml中添加Command绑定,并在viewmodel中给出它的对应属性。该视图模型将被赋予窗口的DataContext。类似于以下内容
- app.xaml.cs
mainWindow.DataContext = viewModel;
- xaml
lt;Button Grid.Row="1" HorizontalAlignment="Right" Margin="0,3,18,3" Name="button1" Width="110" Command="{Binding LoadCommand}">_Load</Button>
- viewmodel
/// <summary> /// Gets the load command. /// </summary> /// <value>The load command.</value> public ICommand LoadCommand { get { if (m_LoadCommand == null) { m_LoadCommand = new RelayCommand(param => CanLoad(), param => Load()); } return m_LoadCommand; } }
这里的relaycommand是一个实现ICommand接口的类。 CanLoad()和Load()是分别为relay命令执行canexecute和执行操作的方法。这是处理按钮的单击事件。
我有一个用户控件,其中注册了自定义routedevent,然后在窗口上使用用户控件。我目前正在代码中明确添加事件处理程序。
//hook up event listeners on the actual UserControl instance this.ucCustomEvent1.CustomClick += new RoutedEventHandler(ucCustomEvent_CustomClick); //hook up event listeners on the main window (Window1) this.AddHandler(UserControlThatCreatesEvent.CustomClickEvent, new RoutedEventHandler(ucCustomEvent_CustomClick));
我不想在代码中显式地挂接routedevent,但是在xaml中以与按钮示例中类似的方式。我上传了工作示例代码here供您阅读。
答案 0 :(得分:2)
我不确定我是否完全理解你的问题,但我希望下面的一个答案会帮助你解决问题。
要在XAML中附加“直接”事件处理程序,只需执行以下操作:
<c:MyUserControl x:Name="uc1" CustomClick="uc1_CustomClickHandler"/>
将一个元素(例如示例中的CustomClick事件)的(路由)事件的处理程序连接到另一个元素(例如父窗口):
<Window c:MyUserControl.CustomClick="ucCustomEvent_CustomClick"/>
现在,如果您想将UI中的事件与ViewModel中的Command绑定,则需要附加行为来执行此操作。有许多框架围绕着它的不同实现。这是你可以尝试的一个:http://sachabarber.net/?p=514。它允许您在代码中执行以下操作:
<c:MyUserControl local:CommandBehavior.RoutedEventName="MyCustomClick"
local:CommandBehavior.TheCommandToRun="{Binding MyViewModelCommand}"/>
希望这有帮助。