как использовать интерфейс, а не конкретный класс для использования в качестве DataContext - wpf, autofac - PullRequest
0 голосов
/ 13 апреля 2020

У меня ниже конкретного класса и помехи,

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},

        };
    }
} 

и использование autofa c для 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();, то это работает. как пользовательский интерфейс?

Спасибо!

1 Ответ

1 голос
/ 13 апреля 2020
    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 >();

      }

...