powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ContentTemplate у CheckBox, не работает привязка.
15 сообщений из 15, страница 1 из 1
ContentTemplate у CheckBox, не работает привязка.
    #37027727
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть следующий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Grid.Resources>
        <DataTemplate x:Key="GroupBoxContent">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>

                <TextBlock Text="Total Submitted" />
                <TextBlock Grid.Column="1" Text="{Binding Path=SubmittedCount}" />

                <TextBlock Grid.Row="1" Text="Total Passed" />
                <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=PassedCount}" />
            </Grid>
        </DataTemplate>
    </Grid.Resources>
               
    <GroupBox
                Header="Local Statistics"
                DataContext="{Binding Path=Local}"
                ContentTemplate="{StaticResource GroupBoxContent}"/>

    <GroupBox Grid.Column="1"
                Header="Overall Statistics"
                DataContext="{Binding Path=Overall}" 
                ContentTemplate="{StaticResource GroupBoxContent}" />
</Grid>

Тут - DataContext="{Binding Path=Local}" привязка идет нормально, проверял. А вот в шаблон дата контекст не доходит и привязка тут - Text="{Binding Path=SubmittedCount}" не работает. Что я упустил или неправильно понимаю? Local и Overall вьюмодельки с полями SubmittedCount, PassedCount и т.п.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37027736
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюки,

Точнее не полями а свойствами. INotifyPropertyChanged реализован нормально.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028090
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руки-крюки,

Не очень хорошо так делать. Не знаю, есть ли где-то рекомендации по этому поводу. Но конструкция DataContext="{Binding Path=Overall}" ужасна. Так как source не указан, то путь берется из DataContext, при втором байдинге откуда брать этот путь? Опять из DataContext? Но туда уже забиндили другой элемент. Думаю что тут может быть просто такая ошибка. Может быть можно попробовать поставить Mode=OneTime, и может быть будет работать, не знаю.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028131
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikh,

Что значит при втором байндинге? Второго не будет, если конечно я не стану вызывать OnPropertyChanged для Local или Overall. Это же ViewModel.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028139
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руки-крюки,

меняется объект DataContext, что провоцирует на проставление значений из байдинга заново. посмотрите в output есть ли там сообщения об ошибках в байдингах.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028182
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikh,

Нет, сообщений об ошибках нету.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028205
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюки,

Вообще говоря, это тоже самое что у листбокса в ItemSource через Path привязать коллекцию ViewModel'ей. Так это делается везде и у всех. Ничего плохо в этом не вижу.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028223
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руки-крюки,

это совершенно не тоже самое.

Еще раз, давайте просто логически просмотрим события.

Форма создается. Начинает выставляется значения из байдинга.
DataContext="{Binding Path=Local}" - в этом случае мы берем объект из DataContext (!!!!), потом по пути объект.Local выставляем значение в DataContext (!!!!). Так же не стоит забывать, что при связывании у нас так же идет подписка на изменение данных соответственно самого DependencyProperty DataContext, а так же и свойства Local объекта из DataContext, который был изначально. Так как в этом байдинге DataContext поменялся, то не удивлюсь, если он вызвал повторную установку байдинга повторно.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028599
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikh,

ИМХО, it depends (by design), если привязка дочерних узлов visual-tree идет после привязки родительских - то влиять не должно, у обоих GroupBox-ов DataContext будет вычисляться правильно...
(если наоборот - тогда вы правы, будет "повторение повторений").

З.Ы. лазить рефлектором по фреймворку счаз нет ни времени, ни желания...
(могу поверить вам на слово, если вы знаете на зубок взаимодействие событий разворачивания visual-tree и data-binding).
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028607
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikh...
DataContext="{Binding Path=Local}" - в этом случае мы берем объект из DataContext (!!!!) , потом по пути объект.Local выставляем значение в DataContext (!!!! ).
...
Для уточнения (по прядку подчеркивания):
1. это DataContext всей формы (VisualRoot-а, что ли?), он выставляется, наверное, в чем-то типа ViewModelBase;
2. это DataContext конкретного GroupBox-а, если на момент его установки DataContext VisualRoot-а уже существует и установлен, то - ничего страшного не произойдет...
(ИМХО).

З.Ы. вполне возможно, что достаточно будет найти такое событие в ViewModelBase, чтобы устанавливать его DataContext до установки DataContext-ов дочерних элементов visual-tree...
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028620
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikh,

Хотя, по здравому размышлению, более склонен согласиться с вами - для такого биндинга GroupBox-ам подойдет лучше синтаксис через RelativeSource, чем "прямой"...
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37028778
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qu-qu,

да не, это чисто предположение, хотя я думаю у них что-то есть для предотвращения этого, так что может я и не прав, нужно просто провести эксперимент.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37029217
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем я убрал шаблон и перенес код из шаблона в юзер контрол. Ну и соответственно в Content груп боксов поместил этот юзер контрол. Теперь все работает нормально.
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37037220
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюкиВ общем я убрал шаблон и перенес код из шаблона в юзер контрол. Ну и соответственно в Content груп боксов поместил этот юзер контрол. Теперь все работает нормально.
Немного не "докрутили" разметку...
(надо было "в Content груп боксов" просто привязать данные из модели).

Видимо, согласно "политике партии": DataTemplate работает со свойством Content, а ControlTemplate со свойством DataContext, вот примерчик, на основе вашего кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// Model.cs
namespace WpfBindingToDataContext
{
   public class Model
   {
      public Foo Local { get; set; }
      public Foo Overall { get; set; }
   }

   public class Foo
   {
      public int SubmittedCount { get; set; }
      public int PassedCount { get; set; }
   }
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
<!-- MainWindow.xaml -->
<Window x:Class="WpfBindingToDataContext.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:lcl="clr-namespace:WpfBindingToDataContext"
        Title="MainWindow" Height="600" Width="300">
   <Grid>
      <Grid.Resources>
         <lcl:Model x:Key="model">
            <lcl:Model.Local>
               <lcl:Foo SubmittedCount="1" PassedCount="2"/>
            </lcl:Model.Local>
            <lcl:Model.Overall>
               <lcl:Foo SubmittedCount="3" PassedCount="4"/>
            </lcl:Model.Overall>
         </lcl:Model>
         <DataTemplate x:Key="GroupBoxContent">
            <Grid>
               <Grid.ColumnDefinitions>
                  <ColumnDefinition />
                  <ColumnDefinition />
               </Grid.ColumnDefinitions>
               <Grid.RowDefinitions>
                  <RowDefinition />
                  <RowDefinition />
               </Grid.RowDefinitions>

               <TextBlock Text="Total Submitted" />
               <TextBlock Grid.Column="1" Text="{Binding DataContext.SubmittedCount
                  ,RelativeSource={RelativeSource FindAncestor, AncestorType=GroupBox}}" />

               <TextBlock Grid.Row="1" Text="Total Passed" />
               <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding DataContext.PassedCount
                  ,RelativeSource={RelativeSource FindAncestor, AncestorType=GroupBox}}" />
            </Grid>
         </DataTemplate>
      </Grid.Resources>
      <Grid.DataContext>
         <StaticResourceExtension ResourceKey="model" />
      </Grid.DataContext>
      <StackPanel>
         <GroupBox Header="Local Statistics"
                DataContext="{Binding Local}"
                ContentTemplate="{StaticResource GroupBoxContent}"/>

         <GroupBox Header="Overall Statistics"
                DataContext="{Binding Overall}" 
                ContentTemplate="{StaticResource GroupBoxContent}" />

         <GroupBox Header="Raw Binding">
            <StackPanel>
               <TextBlock Text="{Binding Local.SubmittedCount, StringFormat='Local Total Submitted: {0}'}" />
               <TextBlock Text="{Binding Local.PassedCount, StringFormat='Local Total Passed: {0}'}" />
               <TextBlock Text="{Binding Overall.SubmittedCount, StringFormat='Overall Total Submitted: {0}'}" />
               <TextBlock Text="{Binding Overall.PassedCount, StringFormat='Overall Total Passed: {0}'}" />
            </StackPanel>
         </GroupBox>

         <StackPanel>
            <StackPanel.Resources>
               <DataTemplate DataType="{x:Type lcl:Foo}">
                  <Grid>
                     <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                     </Grid.ColumnDefinitions>
                     <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                     </Grid.RowDefinitions>

                     <TextBlock Text="Total Submitted" />
                     <TextBlock Grid.Column="1" Text="{Binding SubmittedCount}" />

                     <TextBlock Grid.Row="1" Text="Total Passed" />
                     <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding PassedCount}" />
                  </Grid>
               </DataTemplate>
            </StackPanel.Resources>
            <GroupBox Header="Local Statistics with generic DataTemplate" Content="{Binding Local}"/>

            <GroupBox Header="Overall Statistics with generic DataTemplate" DataContext="{Binding Overall}" />
         </StackPanel>
         <StackPanel>
            <StackPanel.Resources>
               <ControlTemplate x:Key="foo">
                     <Grid>
                        <Grid.ColumnDefinitions>
                           <ColumnDefinition />
                           <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                           <RowDefinition />
                           <RowDefinition />
                        </Grid.RowDefinitions>

                        <TextBlock Text="Total Submitted" />
                        <TextBlock Grid.Column="1" Text="{Binding SubmittedCount}" />

                        <TextBlock Grid.Row="1" Text="Total Passed" />
                        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding PassedCount}" />
                     </Grid>
               </ControlTemplate>
            </StackPanel.Resources>
            <GroupBox Header="Local Statistics with templated ContentControl">
               <ContentControl Content="{Binding Local}" Template="{StaticResource foo}"/>
            </GroupBox>

            <GroupBox Header="Overall Statistics with templated ContentControl">
               <ContentControl DataContext="{Binding Overall}" Template="{StaticResource foo}"/>
            </GroupBox>
         </StackPanel>
         <StackPanel>
            <StackPanel.Resources>
               <DataTemplate x:Key="foo">
                  <Grid>
                     <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                     </Grid.ColumnDefinitions>
                     <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                     </Grid.RowDefinitions>

                     <TextBlock Text="Total Submitted" />
                     <TextBlock Grid.Column="1" Text="{Binding SubmittedCount}" />

                     <TextBlock Grid.Row="1" Text="Total Passed" />
                     <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding PassedCount}" />
                  </Grid>
               </DataTemplate>
            </StackPanel.Resources>
            <GroupBox Header="Local Statistics with named DataTemplate"
                Content="{Binding Local}" ContentTemplate="{StaticResource foo}"/>

            <GroupBox Header="Overall Statistics with named DataTemplate"
                Content="{Binding Overall}" ContentTemplate="{StaticResource foo}"/>
         </StackPanel>
      </StackPanel>
   </Grid>
</Window>
По порядку следования:
1. ваш шаблон и мои binding-и в нем, так, чтобы все работало как ожидалось (binding-и - "мозговыедальные", ИМХО);
2. тупой прямой binding для проверки, что DataContext у рута устанавливается правильно;
3. binding в DataTemplate по типу данных (видно, что binding на Content работает, а на DataContext нет);
4. binding в ControlTemplate по ключу (видно, что binding на DataContext работает, а на Content нет);
5. binding в DataTemplate по ключу (чтобы не было сомнений, что ваш случай требовал только замены binding-а на Content вместо DataContext).

З.Ы. Denis Gladkikh,
почитал я про binding на DataContext - в общем случае не возбраняется (что подтверждается текущим примером), но настоятельно рекомендуется избегать, т.к. есть возможность "отстрелить себе ногу" путем циклических ссылок на один и тот же DataContext... (в контексте данного примера этого нет, т.к. все иерархически тупо и просто - контейнер -> свойство, никаких авто-ссылок).
...
Рейтинг: 0 / 0
ContentTemplate у CheckBox, не работает привязка.
    #37058840
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu,

Ох, спасибо. Только сейчас увидел ваш ответ.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ContentTemplate у CheckBox, не работает привязка.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]