WPF, ItemSelected from DataGrid теряет значение в контейнере Winstor Castle - PullRequest
0 голосов
/ 27 сентября 2019

Где я допустил ошибку?У меня очень простой проект 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>();
    }
 }
...