powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Доступ к ViewModel из вложенных элементов GridControl
2 сообщений из 2, страница 1 из 1
Доступ к ViewModel из вложенных элементов GridControl
    #39564674
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую Grid под Wpf (от DevExpress, но для вопроса, может быть, это не важно): в шаблоне вложенных элементов я не могу обратиться к Вью-Модели так:
Код: xml
1.
<Button Content="MyButton" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}"/>


а пишу так:
Код: xml
1.
<Button Content="MyButton" Visibility="{Binding DataContext.IsEditMode, RelativeSource={RelativeSource AncestorType=dxg:GridControl}, Converter={StaticResource BooleanToVisibilityConverter}}"


В общем, везде, где идет обращение к Вью-Модели (свойства, команды и т.д.) я добавляю RelativeSource. По этой же причине стили не работают в части, где есть привязка к Вью-Модели.
1) Есть ли способ один раз задать в шаблоне RelativeSource?
2) Как можно указать стиль для элемента и задать ему RelativeSource? Если такое возможно.

Код:

Код: xml
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.
<Window.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
        <Style x:Key="MyGridStyle" TargetType="dxg:GridControl">
            <Style.Resources>
                <Style TargetType="dxg:GridColumn">
                    <Setter Property="HorizontalHeaderContentAlignment" Value="Center"/>
                </Style>
                <Style TargetType="dxg:TableView">
                    <Setter Property="AllowEditing" Value="{Binding IsEditMode}"/>
                    <Setter Property="ShowIndicator" Value="{Binding IsEditMode}"/>
                </Style>
            </Style.Resources>
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <dxg:GridControl ItemsSource="{Binding Users}" SelectedItem="{Binding SelectedUser}" MaxHeight="850" Style="{StaticResource MyGridStyle}">
                <dxg:GridControl.Columns>
                    <dxg:GridColumn FieldName="Name" Header="User name"/>
                </dxg:GridControl.Columns>
                <dxg:GridControl.View>
                    <dxg:TableView ShowGroupPanel="False" AllowEditing="{Binding IsEditMode}"/>
                </dxg:GridControl.View>

                <dxg:GridControl.DetailDescriptor>
                    <dxg:ContentDetailDescriptor>
                        <dxg:ContentDetailDescriptor.ContentTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <dxg:GridControl ItemsSource="{Binding Orders}" MaxHeight="500" Style="{StaticResource MyGridStyle}">
                                        <dxg:GridControl.Columns>
                                            <dxg:GridColumn FieldName="Title" Header="Order title"/>
                                            <dxg:GridColumn FieldName="ClientName" Header="Order client name"/>
                                        </dxg:GridControl.Columns>
                                        <dxg:GridControl.View>
                                            <dxg:TableView ShowGroupPanel="False"/>
                                        </dxg:GridControl.View>
                                    </dxg:GridControl>
                                    <Button Content="Add..." 
                                            Visibility="{Binding DataContext.IsEditMode, RelativeSource={RelativeSource AncestorType=dxg:GridControl}, Converter={StaticResource BooleanToVisibilityConverter}}"
                                            Command="{Binding DataContext.AddNewOrderCommand, RelativeSource={RelativeSource AncestorType=dxg:GridControl}}" CommandParameter="{Binding Orders}"/>                                    
                                    </Button>
                                </StackPanel>
                            </DataTemplate>
                        </dxg:ContentDetailDescriptor.ContentTemplate>
                    </dxg:ContentDetailDescriptor>
                </dxg:GridControl.DetailDescriptor>

            </dxg:GridControl>
            <Button Content="Edit mode" Command="{Binding EditModeCommand}"/>
        </StackPanel>
    </Grid>


...
Рейтинг: 0 / 0
Доступ к ViewModel из вложенных элементов GridControl
    #39564750
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я хз, что тут происходит, но вы можете в любой момент, в любом месте переопределить свойство DataContext и после этого все Binding'и будут привязываться к нему.
просто напишите на нужном вам уровне вложенности
DataContext="{Binding RelativeSource=блаблабла}, а потом во всех вложенных элементах обращайтесь через Binding. DataContext это наследуемое свойство, любой объект добавленный в дерево наследует значение этого свойства у своего родителя, если оно явно не определено.

Есть еще свойство Content у ContentControl'а и ContentPresenter'а, часто если его не определить, то содержимое не будет иметь контекста, он будет Null, его можно просто задать через Content="{Binding}", чтоб содержимое (контекст шаблона) были такими же как контекст контейнера.
ставить всё это гавнище от DevExpress, чтоб решить проверить мне западло, могу если сами не справитесь помочь через TeamViewer или скайп, на худой конец :)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Доступ к ViewModel из вложенных элементов GridControl
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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