如何使用接口而不是用作DataContext的具体类-wpf,autofac

问题描述 投票:0回答:1

我下面有具体的课程和内容,

public interface IMyViewModel
{
    ObservableCollection<Person> People { get; set; }
}

public class MyViewModel : INotifyPropertyChanged, IMyViewModel
{
    private ObservableCollection<Person> _people;
    public ObservableCollection<Person> People
    {
        get => _people;
        set
        {
            if (value == _people)
                return;

            _people = value;
            OnPropertyChanged();
        }
    }

    public MyViewModel()
    {
        _people = new ObservableCollection<Person>
        {
            new Person() {Id = 1, Name = "Bob", Age = 45},

        };
    }
} 

并且使用autofac进行DI,

 builder.RegisterType<MyViewModel>().As<IMyViewModel>();

现在在我的xaml文件中,我试图绑定一个列表视图,

<ListView ItemsSource="{Binding People, Mode=OneWay}">
        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" Width="100"/>
                <GridViewColumn  Header="Age">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Age}" Width="100"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

在我想使用接口而不是具体的视图模型类的xaml代码后面,该如何使用?

如果我使用的是DataContext = _viewModel;,则无法使用,并且没有记录绑定到列表视图。

 public partial class NetworkConfiguration : Window
{
    private IMyViewModel _viewModel;

    public NetworkConfiguration()
    {
        InitializeComponent();

        //DataContext = new MyViewModel();

        DataContext = _viewModel;
    }

    public IMyViewModel ViewModel
    {
        get
        {
            return _viewModel;
        }
        set
        {
            DataContext = value;
            _viewModel = value;
        }
    }
}

注意-如果我使用的是DataContext = new MyViewModel();,则可以使用。如何使用用户界面?

谢谢!

c# wpf datacontext
1个回答
1
投票
    public IMyViewModel ViewModel
    {
        get
        {
            return _viewModel;
        }
        set
        {
            DataContext = value;
            _viewModel = value;
        }
    }

您需要使用容器中的值实际分配ViewModel


      var builder = new ContainerBuilder();
      builder.RegisterType<MyViewModel>().As<IMyViewModel>();

      // This is your container, here you can get your instances from!
      Container = builder.Build();

      // Create the scope, resolve your interface,
      // use it, then dispose of the scope.
      using (var scope = Container.BeginLifetimeScope())
      {
         // get the vm from the container, assign it as datacontext.
         DataContext = scope.Resolve<IMyViewModel >();

      }

© www.soinside.com 2019 - 2024. All rights reserved.