我创建了一个附加属性AttachedBehaviorsManager.Behaviors,用作将事件绑定到命令的MVVM帮助程序类。该属性的类型为BehaviorCollection(ObservableCollection的包装器)。我的问题是行为命令的绑定总是为空。当在按钮上使用它虽然工作得很好。
我的问题是为什么我在集合中的项目上丢失了DataContext,我该如何修复它?
<UserControl x:Class="SimpleMVVM.View.MyControlWithButtons"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:behaviors="clr-namespace:SimpleMVVM.Behaviors"
xmlns:con="clr-namespace:SimpleMVVM.Converters"
Height="300" Width="300">
<StackPanel>
<Button Height="20" Command="{Binding Path=SetTextCommand}" CommandParameter="A" Content="Button A" />
<Button Height="20" Command="{Binding Path=SetTextCommand}" CommandParameter="B" Content="Button B"/>
<TextBox x:Name="tb" Text="{Binding Path=LabelText}">
<behaviors:AttachedBehaviorsManager.Behaviors>
<behaviors:BehaviorCollection>
<behaviors:Behavior Command="{Binding Path=SetTextCommand}" CommandParameter="A" EventName="GotFocus"/>
</behaviors:BehaviorCollection>
</behaviors:AttachedBehaviorsManager.Behaviors>
</TextBox>
</StackPanel>
答案 0 :(得分:0)
为什么绑定命令?命令应以这种方式设置:
<Button Command="ApplicationCommands.Open"/>
假设您定义了一个命令类,如下所示:
namespace SimpleMVVM.Behaviors {
public static class SimpleMvvmCommands {
public static RoutedUICommand SetTextCommand { get; }
}
}
你会像这样使用它:
<Button Command="behaviors:SimpleMvvmCommands.SetTextCommand"/>
MVVM模式不适用于您使用它的方式。您将命令处理程序放在VM上,但命令本身应该位于静态上下文中。有关详细信息,请参阅documentation on MSDN。
答案 1 :(得分:0)
绑定到命令,因为这是使用MVVM(Model-View-ViewModel)模式。此用户控件的datacontext是一个ViewModel对象,其中包含一个公开该命令的属性。命令不需要是公共静态对象。
所示代码中的按钮执行没有问题。它们绑定到viewmodel中的SetTextCommand:
class MyControlViewModel : ViewModelBase
{
ICommand setTextCommand;
string labelText;
public ICommand SetTextCommand
{
get
{
if (setTextCommand == null)
setTextCommand = new RelayCommand(x => setText((string)x));
return setTextCommand;
}
}
//LabelText Property Code...
void setText(string text)
{
LabelText = "You clicked: " + text;
}
}
问题是在行为中无法识别对按钮中工作的相同SetTextCommand的绑定: