Где я допустил ошибку?У меня очень простой проект WPF с Виндзорским замком IoC.Он состоит из двух окон.В первом из них два элемента управления: DataGrid и TextBox (TextBox для отображения значения выбранной строки).Нажатие на кнопку в первом окне вызывает открытие второго окна с TextBox, в котором я ожидаю увидеть выбранное значение из DataGrid Row в первом окне.Тип DataGrid SelectedItem - IPerson.Тип значения, отображаемого в TextBox второго окна тоже.IPerson принадлежит к контейнеру.Почему во втором окне контейнер получает значение из конструктора, а не из контейнера.Когда я изменяю значение IPerson с ItemSelected на значение из другого TextBox, все работает хорошо.
Классы:
public interface IPerson
{
string name { get; set; }
}
public class Person : IPerson
{
public string name { get; set; }
public Person( string n = "Empty string")
{
name = n;
}
}
public interface IViewFactory
{
T create<T>();
}
Window1:
<DataGrid
ItemsSource="{Binding personList, Mode=TwoWay}"
SelectedItem="{Binding personSel, Mode=TwoWay}"/>
<TextBox
Text="{Binding personSel.name, Mode=TwoWay}"/>
<Button
Command="{Binding clickButton}"/>
Window1ViewModel:
public class Window1ViewModel
{
public IPerson personSel { get; set; }
public List<IPerson> personList { get; set; }
public IViewFactory factory { get; set; }
public Window2ViewModel viewModel { get; set; }
public ICommand clickButton { get; set; }
public Window1ViewModel()
{
personList = new List<IPerson>();
initList();
clickButton = new RelayCommand(onClickButton);
}
private void onClickButton()
{
Window2 w = new Window2( viewModel);
w.Show();
}
private void initList()
{
personList.AddRange( new List<IPerson>(){ new Person() { name= "name1"},
new Person() { name = "name2" },
new Person() { name = "name3" } }
);
}
}
Window2:
<TextBox
Text="{Binding person.name, Mode=TwoWay}"/>
Window2ViewModel:
public class Window2ViewModel
{
public IPerson person { get; set; }
}
InstallerRaf:
public class InstallerRaf: IWindsorInstaller
{
void IWindsorInstaller.Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<IWindsorContainer>().Instance(container),
Component.For<IViewFactory>().ImplementedBy< WindsorViewFactory>(),
Component.For<IPerson>().ImplementedBy<Person>(),
Component.For<Window1>(),
Component.For<Window2>(),
Component.For<Window1ViewModel>(),
Component.For<Window2ViewModel>()
);
}
}
WindstorViewFactory:
public class WindsorViewFactory : IViewFactory
{
private IWindsorContainer container;
public WindsorViewFactory( IWindsorContainer _container)
{
container = _container;
}
public T create<T>()
{
return container.Resolve<T>();
}
}