首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewModelLocator未燃起

ViewModelLocator未燃起
EN

Stack Overflow用户
提问于 2020-10-16 09:39:15
回答 2查看 185关注 0票数 0

我最近读到了关于MVVM (和MVVM )的文章,所以尝试在一个有2 ViewModels的应用程序中实现。

当我在数据文本中使用ViewModelLocator时,命令绑定不起作用,如果我将ViewModel绑定到ViewModel本身的数据文本,它就能工作!

我在这里错过了什么?

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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视图代码:

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-16 09:53:39

用户控件的数据上下文是一个ViewModelLocator,该按钮绑定到MoCoConnectCommand属性。但是类ViewModelLocator没有属性MoCoConnectCommand

我认为您需要在用户控件的数据上下文中注入MotionViewModel,例如:

代码语言:javascript
复制
<UserControl.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator x:Key="Locator"/>
    </ResourceDictionary>
</UserControl.Resources>

<UserControl.DataContext>
    <Binding Source="{StaticResource Locator}" Path="motionViewModel" />
</UserControl.DataContext>
票数 2
EN

Stack Overflow用户

发布于 2020-10-16 10:02:08

如果您想进入这个过程,请尝试避免使用外部库。它们只会让事情变得混乱。

需要理解的是,当您编写SomeProperty=“{}”时,它是绑定到该用户控件的DataContext。如何设置数据文本?简单的例子:

将此(您的文件名替换示例名称)写入您的App.xaml.cs(重写onstartup方法),并从App.xaml中删除"StartupUri“

代码语言:javascript
复制
Window w = new Window();
w.DataContext= new SomethingViewModel();
w.Show();

现在可以从SomethingViewModel绑定到Window.xaml中的公共属性。

你还需要什么:

基类中的-Implementation of INotifyPropertyChange (ViewModelBase或任何您想要的名称),您可以继续继承需要刷新UI的视图模型和对象。

-Implementation of RelayCommand.这可以用于在任何视图模型中创建可以绑定到控件命令(例如Button )的命令。

编辑:如果你坚持使用第三方图书馆,另一个答案应该能解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64386675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档