На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Декларативная привязка данных элемента формы к ListBox на этой же форме , WPF
    Есть проект WPF.

    ExpandedWrap disabled
      <Application x:Class="IA.WPF.App"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
          <Application.Resources>
              
          </Application.Resources>
      </Application>


    StartupURI специально убран, для того, что бы главное окно создавалось не конструктором по умолчанию.

    ExpandedWrap disabled
          public partial class App : Application
          {
              private const string DataFileName = "data.dat";
              private static readonly Man MainUser = new Man();
       
              protected override void OnStartup(StartupEventArgs e)
              {
                  var mainWnd = new ManWnd {Man = MainUser};
              }
       
              }


    Ну там еще есть код, но он к делу не относится и работает нормально.

    Есть такое окно:

    ExpandedWrap disabled
      <Window x:Class="IA.WPF.ManWnd"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="ManWnd" Height="319" Width="506" WindowStartupLocation="CenterScreen">
          
          <DockPanel Name="dpnLayout">
              <Label SnapsToDevicePixels="True" Name="lblOwner" DockPanel.Dock="Top" VerticalAlignment="Top" Margin="5" BorderThickness="1" BorderBrush="Black" FontWeight="Bold">Лабел</Label>
              <Grid Name="stpLayout" DockPanel.Dock="Top" Margin="5">
                  <Grid.ColumnDefinitions>
                      <ColumnDefinition Name="colList" Width="*" />
                      <ColumnDefinition Name="colInfo" Width="2*" />
                  </Grid.ColumnDefinitions>
                  <ListBox Grid.ColumnSpan="1" HorizontalAlignment="Stretch" Name="lsbPeoples" DisplayMemberPath="FullName"/>
              </Grid>
          </DockPanel>
      </Window>


    Код такой:

    ExpandedWrap disabled
      namespace IA.WPF
      {
          /// <summary>
          /// Interaction logic for ManWnd.xaml
          /// </summary>
          public partial class ManWnd : Window
          {
              private Man _Man;
              public Man Man
              {
                  get
                  {
                      return _Man;
                  }
                  set
                  {
                      _Man = value;
                      lblOwner.Content = _Man.FullName;
                      lsbPeoples.DataContext = _Man.Relatives;
                  }
              }
       
              public ManWnd()
              {
                  InitializeComponent();
              }
          }
      }


    Все работает...

    Но хотелось бы обойтись без строки lsbPeoples.DataContext = _Man.Relatives; в C# коде.

    Как можно в XAML прописать что бы занчения листбокс брал из поля класса окна? Если это вообще возможно...
      Можно обойтись... но код XAML не смогу привести, но скажу что надо наследоваться классу Man от ListBoxItem и указать потом его как ресурс для ListBox.
      а вот тут более подробно сюда
        Суть не втом. Суть в том, как в разметке получить доступ к полую экземпляра, а не статическому.

        Для статического поля нашел такой вариант:

        ExpandedWrap disabled
              public partial class ManWnd : Window
              {
                  public static ObservableCollection<Man> Mans = new ObservableCollection<Man>();
                  
                  private Man _Man;
                  public Man Man
                  {
                      get
                      {
                          return _Man;
                      }
                      set
                      {
                          _Man = value;
                          lblOwner.Content = _Man.FullName;
          //              lsbPeoples.DataContext = _Man.Relatives;
                          Mans.Clear();
           
                          foreach (var man in _Man.Relatives)
                          {
                              Mans.Add( man );
                          }
                      }
                  }
           
                  public ManWnd()
                  {
                      InitializeComponent();
                  }
              }


        ExpandedWrap disabled
                      <ListBox Grid.ColumnSpan="1" HorizontalAlignment="Stretch" Name="LsbPeoples" ItemsSource="{x:Static src:ManWnd.Mans}" DisplayMemberPath="FullName" />


        Но это все-таки немного не то, что я хотел.

        Добавлено
        Получается что форма может быть только одна.
          Вопрос решил таким образом

          ExpandedWrap disabled
                public partial class ManWnd : Window
                {
                    public Man Man { get; set; }
             
                    public ManWnd()
                    {
                        InitializeComponent();
                        DataContext = this;
                    }
                }


          ExpandedWrap disabled
            <ListBox BorderThickness="1" BorderBrush="Black" Name="lsbPeoples" ItemsSource="{Binding Path=Man.Relatives}" DisplayMemberPath="FullName" />


          Кто хорошо разбирается, прокмментируйте, пожалуйста, какие засады есть у такого способа?
            Там еще как-то можно поиграться с
            ExpandedWrap disabled
              Binding="{... RelativeSource={RelativeSource Self}}"

            подробнее уже не помню

            --

            т.е. в xaml для самого окна попробовать задать DataContext="{Binding RelativeSource={RelativeSource Self}}", а уже для контрола - то, что ты указал. Но как по мне - можно одинаково "забыть" указать что xaml-разметку, что "DataContext = this;". Да и твой вариант мне нравится больше :)
            Сообщение отредактировано: Raino -
              Цитата Raino @
              Но как по мне - можно одинаково "забыть" указать что xaml-разметку, что "DataContext = this;".

              Забыть то можно, но я стермился к полному разделению кода и разметки, что бы дезайнер мог полностью извращаться как ему заблагорассудится, не держа в уме какие-то условности...

              ЗЫЖ Спасибо за коммент, закрывают тему.
              Сообщение отредактировано: Felan -
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0302 ]   [ 15 queries used ]   [ Generated: 20.05.24, 13:06 GMT ]