Ответы пользователя по тегу WPF
  • Как правильно реализовать "сложную" привязку данных в wpf?

    @Meloman19
    Ну у вас тут сразу же 2 ошибки.

    Первая, DataContext в StackPanel таким образом вы выставить не сможете, потому что у самого окна DataContext пустой. У вас вообще View нигде не пересекается с ViewModel. Хотя как минимум одна точка пересечения быть должна. Обычно это делают в App.xaml.
    Открываете App.xaml и удаляете StartupUri. Там же вбиваете Startup и добавляете на это событие обработчик в коде.
    private void Application_Startup(object sender, StartupEventArgs e)
    {
       MainWindow = new MainWindow
       {
          DataContext = new Service
          {
             Id = 0,
             Info = new InfoService
             {
                Id = 1,
                Main = new ServiceMain { Id = 2, Name = "Тест"}
             }
          }
       };
       MainWindow.Show();
    }


    Вторая: у вас свойства вложенные. Поэтому нужно вложенные TextBox'ы делать. Код приложен с учётом, что вы сделали, как в предыдущем пункте.
    <StackPanel>
          <TextBlock Text="Service"/>
          <TextBox Text="{Binding Path=Id}"/>
          <StackPanel DataContext={Binding Info}>
                <TextBlock Text="InfoService"/>
                <TextBox Text="{Binding Path=Id}"/>
                <StackPanel DataContext={Binding Main}>
                      <TextBlock Text="ServiceMain"/>
                      <TextBox Text="{Binding Path=Id}"/>
                </StackPanel>
          </StackPanel>
    </StackPanel>


    Ну и сразу замечание на будущее. Имеет смысл PropertyChanged и метод RaisePropertyChanged выделить в отдельный класс, от которого в дальнейшем наследовать все ваши ViewModel (Service, InfoService, ServiceMain).
    Ответ написан
    Комментировать