我最近读到了关于MVVM (和MVVM )的文章,所以尝试在一个有2 ViewModels的应用程序中实现。
当我在数据文本中使用ViewModelLocator时,命令绑定不起作用,如果我将ViewModel绑定到ViewModel本身的数据文本,它就能工作!
我在这里错过了什么?
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MotionViewModel>();
SimpleIoc.Default.Register<LiveViewViewModel>();
}
public LiveViewViewModel liveViewViewModel
{
get
{
return ServiceLocator.Current.GetInstance<LiveViewViewModel>();
}
}
public MotionViewModel motionViewModel
{
get
{
return ServiceLocator.Current.GetInstance<MotionViewModel>();
}
}
public static void Cleanup()
{
ClearLiveViewViewModel();
ClearMotionViewModel();
}
public static void ClearLiveViewViewModel()
{
ServiceLocator.Current.GetInstance<LiveViewViewModel>().CloseCamera();
ServiceLocator.Current.GetInstance<LiveViewViewModel>().Cleanup();
}
public static void ClearMotionViewModel()
{
ServiceLocator.Current.GetInstance<MotionViewModel>().Cleanup();
}
}这是ViewModel代码:
public class MotionViewModel : ViewModelBase
{
private RelayCommand _mocoConnectCommand;
public MotionViewModel()
{
if (IsInDesignMode)
{
// Code runs in Blend --> create design time data.
}
else
{
// Code runs "for real"
Task.Factory.StartNew(() => Initialize());
}
}
public RelayCommand MoCoConnectCommand
{
get;
private set;
}
private void Initialize()
{
MoCoConnectCommand = new RelayCommand(MoCoConnect);
}
private void MoCoConnect()
{
MessageBox.Show("Connection button pressed");
}
#endregion
}这是XAML视图代码:
<UserControl.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator"/>
</ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource Locator}" />
</UserControl.DataContext>
<Button Style="{DynamicResource MahApps.Metro.Styles.MetroButton}"
Grid.Column="0" Grid.Row="0"
Height="30" Width="28" Margin="-1,2,1.333,2.667"
Command="{Binding MoCoConnectCommand}" >
<iconPacks:FontAwesome Kind="LinkSolid"/>
</Button>发布于 2020-10-16 09:53:39
用户控件的数据上下文是一个ViewModelLocator,该按钮绑定到MoCoConnectCommand属性。但是类ViewModelLocator没有属性MoCoConnectCommand。
我认为您需要在用户控件的数据上下文中注入MotionViewModel,例如:
<UserControl.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator"/>
</ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource Locator}" Path="motionViewModel" />
</UserControl.DataContext>发布于 2020-10-16 10:02:08
如果您想进入这个过程,请尝试避免使用外部库。它们只会让事情变得混乱。
需要理解的是,当您编写SomeProperty=“{}”时,它是绑定到该用户控件的DataContext。如何设置数据文本?简单的例子:
将此(您的文件名替换示例名称)写入您的App.xaml.cs(重写onstartup方法),并从App.xaml中删除"StartupUri“
Window w = new Window();
w.DataContext= new SomethingViewModel();
w.Show();现在可以从SomethingViewModel绑定到Window.xaml中的公共属性。
你还需要什么:
基类中的-Implementation of INotifyPropertyChange (ViewModelBase或任何您想要的名称),您可以继续继承需要刷新UI的视图模型和对象。
-Implementation of RelayCommand.这可以用于在任何视图模型中创建可以绑定到控件命令(例如Button )的命令。
编辑:如果你坚持使用第三方图书馆,另一个答案应该能解决你的问题。
https://stackoverflow.com/questions/64386675
复制相似问题