我有一个层次结构Menu中的每个MenuItem都将其Command属性设置为RoutedCommand我已定义的属性.关联CommandBinding提供了一个回调,用于评估CanExecute控制每个的启用状态MenuItem.
这几乎可行.菜单项最初会显示正确的启用和禁用状态.但是,当我的CanExecute回调使用的数据发生变化时,我需要命令从我的回调中重新请求结果,以便在UI中反映这种新状态.
似乎没有任何公共方法RoutedCommand或CommandBinding为此.
请注意,当我单击或键入控件时再次使用回调(我猜它是在输入时触发的,因为鼠标悬停不会导致刷新).
最简单的方法是实现ButtonClick事件处理程序和调用Window.Close()方法,但是如何通过Command绑定来实现呢?
我查看了这个网站和谷歌,解决方案对我不起作用.
我在UserControl的ViewModel上有一个命令.好吧,usercontrol有一个绑定到ObservableCollection的ItemsControl.在ItemsControl.ItemTemplate的DataTemplate中,我有一个按钮,我想使用该命令.我无法绑定命令,因为在DataTemplate中,datacontext不是ViewModel而是ObservableCollection的项.
问题是:如果丢失了父datacontext,如何将按钮绑定到命令?
我认为这需要一个简单的解决方案,因为我认为这是一个常见的问题.
想象一下这个场景:
您有一个带有observableCollection的ListBox项作为ItemsSource,因此您在ListBox中为集合中的每个元素使用了一个datatemplate.好吧,您想删除所选项目,并在该行的每一行中放置一个按钮.你是怎样做的?
在MVP中,我可以在按钮的单击事件中执行此操作:
Button but = e.Source as Button;
if (but != null)
Presenter.ActualNote = but.DataContext as Note;
Run Code Online (Sandbox Code Playgroud)
简而言之.您将行的datacontext(所选项目)发送到演示者.
但是,我怎么能用mvvm方式呢?因为我需要使用命令但是我无法将命令分配给按钮,因为该按钮对ViewModel(命令所在的位置)一无所知.
正如您所看到的,按钮必须存在于datatemplate中,然后datacontext不再是ViewModel ....这就是我需要访问父级DataContext以访问命令的原因.
我希望你能更好地理解我的问题.
谢谢.
我知道如何在我的DataGrid中使用MouseDoubleClick事件来获取selectedvalue,但是如何使用命令绑定呢?这样我的ViewModel就可以处理逻辑.
到目前为止,我有以下内容:
<DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="True" MouseDoubleClick="TestGrid_MouseDoubleClick"
ItemsSource="{Binding Registrations}" SelectedValue="{Binding CurrentRegistration}" IsReadOnly="True" AlternationCount="2" GridLinesVisibility="None">
Run Code Online (Sandbox Code Playgroud)
我想摆脱MouseDoubleClick并适当地替换它.
我试图在视图加载完成后获得一个方法来运行.我试图将命令绑定到Loaded视图中的事件但它无法运行.抛出的内部异常是
'为'System.Windows.Data.Binding'提供价值引发了一个异常.行号'14'和行位置'14'
<UserControl x:Class="Components.Map.MapView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:map="clr-namespace:Components.Map"
xmlns:controls="clr-namespace:Windows.Controls;assembly=Windows.Controls"
xmlns:ValidationRules="clr-namespace:Windows.Controls.ValidationRules;assembly=Windows.Controls"
xmlns:directGraphicsControl="clr-namespace:Windows.DirectGraphicsControl;assembly=Windows.DirectGraphicsControl"
xmlns:colorBar="clr-namespace:Components.Common.ColorBar;assembly=Components.Common"
xmlns:RefinedRibbonControls="clr-namespace:Components.Common.Controls.RefinedRibbonControls;assembly=Components.Common"
xmlns:UserControls="clr-namespace:Components.Common.UserControls;assembly=Components.Common"
xmlns:map1="clr-namespace:Models.Map;assembly=Models.Map"
xmlns:utilities="clr-namespace:Windows.Utilities;assembly=Windows.Utilities"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Loaded="{Binding Path=MapControlViewModel.MapLoadedCommand}">
Run Code Online (Sandbox Code Playgroud)
我怎么能绑定到视图的Loaded事件,所以我可以在视图加载完后运行一些东西?
(注-这是一个重新出任我的第一个问题,下得了错误标题发布:这里对不起!)
我有一个标准的WPF树视图,并有绑定项目来查看模型类.
我现在希望在双击项目时处理行为(打开文档visual-studio-style).
我可以在树视图(显示xaml)的控件中触发事件处理程序,但是如何绑定到视图模型类上的特定行为 - 例如ProjectViewModel?
最好绑定到ICommand-implementationmen,因为这在别处使用...
<TreeView ItemsSource="{Binding Projects}" MouseDoubleClick="TreeView_MouseDoubleClick">
<TreeView.ItemContainerStyle>
<!--
This Style binds a TreeViewItem to a TreeViewItemViewModel.
-->
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="FontWeight" Value="Normal" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type Implementations:ProjectViewModel}" ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<Image Width="16" Height="16" Margin="3,0" Source="Images\Region.png" />
<TextBlock Text="{Binding DisplayName}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type Implementations:PumpViewModel}" ItemsSource="{Binding Children}"> …Run Code Online (Sandbox Code Playgroud) 我刚开始学习MVVM.我通过遵循这个MVVM教程从头开始制作应用程序(我强烈推荐给所有MVVM初学者).基本上,我到目前为止创建的是一些文本框,其中用户添加他或她的数据,一个按钮来保存该数据,随后使用所有条目填充ListBox.
这就是我陷入困境的地方:我希望能够双击ListBoxItem并触发我创建并添加到ViewModel的命令.我不知道如何完成XAML方面,即我不知道如何将该命令绑定到ListBox(Item).
这是XAML:
...
<ListBox
Name="EntriesListBox"
Width="228"
Height="208"
Margin="138,12,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemsSource="{Binding Entries}" />
...
Run Code Online (Sandbox Code Playgroud)
这是ViewModel:
public class MainWindowViewModel : DependencyObject
{
...
public IEntriesProvider Entries
{
get { return entries; }
}
private IEntriesProvider entries;
public OpenEntryCommand OpenEntryCmd { get; set; }
public MainWindowViewModel(IEntriesProvider source)
{
this.entries = source;
...
this.OpenEntryCmd = new OpenEntryCommand(this);
}
...
}
Run Code Online (Sandbox Code Playgroud)
最后,这是我想在用户双击EntriesListBox中的项目后执行的OpenEntryCommand:
public class OpenEntryCommand : ICommand
{
private MainWindowViewModel viewModel;
public OpenEntryCommand(MainWindowViewModel viewModel)
{
this.viewModel = viewModel;
}
public event …Run Code Online (Sandbox Code Playgroud) 我的WPF应用程序中有一个搜索字段,其中包含一个包含命令绑定的搜索按钮.这很好用,但是当按下键盘上的Enter键时,如何对文本字段使用相同的命令绑定?我见过的例子都是使用KeyDown事件处理程序后面的代码.有没有一种聪明的方法可以使用xaml和命令绑定来完成这项工作?
我正在开发一个WPF应用程序,并且有一个TextBlock,我想使用命令绑定来点击时触发命令.实现这一目标的最佳方法是什么?
TextBlock控件没有Command属性,但它有一个CommandManager.这是什么?它可以用于命令绑定吗?我已经看过许多其他控件以及这个属性..
我有一些可以使用的监督控制吗?是否建议使用按钮并将其设计为不像按钮?
是否有一些控件支持Command绑定,我可以围绕TextBlock?
我应该创建一个自定义控件,它基本上是一个TextBlock,但具有额外的属性Command和CommandArgument,它可以在例如MouseLeftButtonDown属性上启用命令绑定.
我绑定我的命令,如:
<Button Command="{Binding NextCommand}"
CommandParameter="Hello"
Content="Next" />
Run Code Online (Sandbox Code Playgroud)
在这里,我还绑定了它的CommandParameter属性,现在如何从NextCommand获取它的值.
public ICommand NextCommand
{
get
{
if (_nextCommand == null)
{
_nextCommand = new RelayCommand(
param => this.DisplayNextPageRecords()
//param => true
);
}
return _nextCommand;
}
}
Run Code Online (Sandbox Code Playgroud)
其功能定义:
public ObservableCollection<PhonesViewModel> DisplayNextPageRecords()
{
//How to fetch CommandParameter value which is set by
//value "Hello" at xaml. I want here "Hello"
PageNumber++;
CreatePhones();
return this.AllPhones;
}
Run Code Online (Sandbox Code Playgroud)
如何获取CommandParameter值?
提前致谢.
commandbinding ×10
wpf ×10
c# ×4
mvvm ×3
.net ×2
command ×2
xaml ×2
binding ×1
button ×1
datagrid ×1
double-click ×1
dynamic ×1
menu ×1
mouseevent ×1
parameters ×1
wpf-controls ×1