Отобразите DataTemplate по умолчанию в ContentControl, когда его содержание будет пустым или пустым?

Вот построчная разбивка:

$scope.checkout = function (cartObj) {

Создается переменная $ scope с именем checkout, которая ссылается на функцию, чтобы вы могли вызывать ее в представлении как checkout() (например, от кнопки с ng-click = "оформить заказ").

Эта функция передается службе с именем cartObj.

var modalInstance = $modal.open({

Переменная modalInstance используется для вызова метода $ modal service open.

Модальная служба UI Bootstrap $ возвращает модальный экземпляр. Методу open передается объект, который определяет конфигурацию модального экземпляра следующим образом:

templateUrl : 'assets/menu/directives/payment-processing-modal.tmpl.html',

Это говорит о том, что модальному экземпляру следует использовать шаблон, найденный по соответствующему URL.

controller : ["$scope", "$modalInstance", "cartObj", function($scope, $modalInstance, cartObj) {
  }],

Это создает контроллер для модального экземпляра, которому передается $ scope, служба $ modalInstance и, что важно, разрешенная служба cartObj.

Сервисы - это синглтоны, которые используются для обмена данными между контроллерами. Это означает, что существует одна версия службы cartObj, и если один контроллер обновляет ее, другой контроллер может запросить службу и получить данные, которые были обновлены любым другим контроллером. Это замечательно, но если переменная должна быть инициализирована с некоторым значением из службы при загрузке контроллера, она вернет undefined, потому что сначала нужно запросить, а затем ждать, чтобы получить данные обратно. Вот где решается проблема:

  resolve : { // This fires up before controller loads and templates rendered
    cartObj : function() {
       return cartObj;
    }
  }
});

Причина использования разрешения, вероятно, заключается в том, что сам шаблон зависит от того, какие данные из cartObj доступны, КОГДА шаблон загружается. Resolve разрешит обещания ДО того, как контроллер загрузится, поэтому, когда это произойдет, данные будут там и готовы. По сути, разрешение упрощает инициализацию модели внутри контроллера, поскольку исходные данные передаются контроллеру, а не контроллеру, который должен выходить и получать данные.

Разрешенный cartObj - это то, что передается в modalInstance и поэтому может быть доступно в контроллере как: cartObj. someproperty .

39
задан 1 August 2009 в 19:08
поделиться

2 ответа

Просто необходимо привязать свойство содержимого к стилю. Стили не будут перезаписывать значение элемента управления, если есть привязка присутствует, даже если значение равно Null. Попробуйте это.

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="Content" Value="{Binding HurfView.EditedPart}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" Value="{x:Null}">
                    <Setter Property="ContentControl.Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                    <TextBlock>EMPTY!</TextBlock>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>
49
ответ дан 27 November 2019 в 02:37
поделиться

Вы можете вернуть DBNull.Value в качестве FallbackValue привязки для содержимого ContentControl и создать DataTemplate для DBNull:

<DataTemplate DataType="{x:Type system:DBNull}">
    <!-- The default template -->
</DataTemplate>

...

<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />
1
ответ дан 27 November 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: