Это не работает, потому что вы устанавливаете экземпляр ObjectDataProvider
на DataContext
<tb:TaskbarIcon.DataContext>
<ObjectDataProvider ObjectType="{x:Type local:NotifyIconViewModel}">
<ObjectDataProvider.ConstructorParameters>
<interface:ServiceControllerWorker />
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
</tb:TaskbarIcon.DataContext>
вместо значения из ObjectDataProvider
.
Объявите провайдера в ResourceDictionary
:
<ResourceDictionary>
<ObjectDataProvider x:Key="ViewModelProvider" ObjectType="{x:Type local:NotifyIconViewModel}">
<ObjectDataProvider.ConstructorParameters>
<interface:ServiceControllerWorker />
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
</ResourceDictionary>
И свяжите это с DataContext
:
<tb:TaskbarIcon DataContext="{Binding Source={StaticResource ViewModelProvider}}" />
Привязка заставит провайдера создавать экземпляр предоставленного экземпляра.
Но так как вы создаете экземпляр с помощью ObjectDataProvider
, вы сделали контейнер Autofac или внедрение зависимостей избыточным. Если вы хотите использовать внедрение зависимостей, вы должны позволить Autofac создавать экземпляры. Для этого необходимо запустить приложение вручную и переписать MainWindow
или хостинг Window
TaskbarIcon
для использования композиции:
public partial class MainWindow : Window
{
public static readonly DependencyProperty NotifyIconProperty = DependencyProperty.Register(
"NotifyIcon",
typeof(TaskbarIcon),
typeof(Window),
new PropertyMetadata(default(TaskbarIcon)));
public TaskbarIcon NotifyIcon { get { return (TaskbarIcon) GetValue(MainWindow.NotifyIconProperty); } set { SetValue(MainWindow.NotifyIconProperty, value); } }
public MainWindow(TaskbarIcon taskbarIcon, INotifyIconViewModel notifyIconDataContext, IViewModel dataContext)
{
this.notifyIcon = taskbarIcon;
this.notifyIcon.DataContext = notifyIconDataContext;
this.DataContext = dataContext;
}
}
В MainWindow.xaml свяжите свойство с ContentPresenter
:
<Window>
<ContentPresenter Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=MainWindow}, Path=NotifyIcon} />
</Window>
Затем настройте контейнер Autofac:
class Bootstrapper : AutofacBootstrapper
{
public Container ConfigureContainerBuilder()
{
var builder = new ContainerBuilder();
builder.RegisterType<ServiceControllerWorker>().As<IServiceControllerWorker>().SingleInstance();
builder.RegisterType<NotifyIconViewModel>().As<INotifyIconViewModel>().SingleInstance();
builder.RegisterType<TaskbarIcon>().SingleInstance();
builder.RegisterType<MainWindow>().SingleInstance();
return builder.Build();
}
}
Затем загрузите приложение:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var bootstrapper = new Bootstrapper();
var container = bootstrapper.ConfigureContainerBuilder();
Application.Current.MainWindow = container.Resolve<MainWindow>();
Application.Current.MainWindow.Show();
}
}
Таким образом, вы избавились от ObjectDataProvider
, так как вместо этого вы используете Autofac.