【问题标题】:how to use interface rather than concrete class to use as DataContext - wpf, autofac如何使用接口而不是具体类来用作 DataContext - wpf,autofac
【发布时间】:2020-04-13 07:40:10
【问题描述】:

我有以下具体的课程和干扰,

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

        };
    }
} 

并为 DI 使用 autofac,

 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();,那么它可以工作。用户界面如何?

谢谢!

【问题讨论】:

  • DataContext = _viewModel; 等价于DataContext = null;。目前尚不清楚您为什么会期待其他任何东西。
  • 那应该怎么做呢?请建议

标签: c# wpf datacontext


【解决方案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 >();

      }

【讨论】:

  • 谢谢,我正在使用 app.xaml.cs 主文件中的所有 DI 代码,DataContext 在那里未知?
  • Datacontext 是特定于控件的,因此您需要从那里访问它。
  • 是的,好的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 2012-11-29
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多