Создание элемента управления скрытым по умолчанию, когда его свойство Visibility связано и контекст установлен после Loaded - PullRequest
2 голосов
/ 07 июня 2011

У меня есть прямоугольник со свойством Visibility, связанным с моделью представления. По (очевидным) причинам производительности я устанавливаю DataContext на странице Loaded событие. Этот прямоугольник должен быть свернут по умолчанию. К сожалению, с этим шаблоном «позднего контекста» прямоугольник отображается в течение нескольких долей секунды.

Есть ли кодовый способ сделать его свернутым по умолчанию?

Если нет, я мог бы просто установить свойство на Collapsed и связать его в событии Loaded, но в моем приложении много таких прямоугольников.

Могу ли я реализовать ContentControl, который свернут до загрузки? Эта вторая идея слишком надумана?

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011

@ Мартин - вы пытались установить FallbackValue в вашей привязке?

У меня нет VS, чтобы проверить его, но я думаю, что если ваша установка похожа (извините за 'ошибки', это всего лишь черновик:

<rectangle visibility={Binding mydata.somthing.someVisibilityProperty} />

тогда, если привязка в Loaded, ваш элемент управления может «мигать» со значением Visibility.Visible по умолчанию. Ваша привязка завершается неудачно при первом рендеринге, потому что еще нет привязки данных. Если это так, то просто установите значение возврата:

<rectangle visibility={Binding mydata.somthing.someVisibilityProperty, FallbackValue=Collapsed} />

это приведет к тому, что привязка будет возвращать «Visibility.Collapsed» всякий раз, когда ей не удается прочитать из источника.

В случае

<Rectangle Visibility="{Binding TipRoundingHasError, Converter={StaticResource VisibilityConverter}}">

, который вы представили во втором ответе, он в основном будет выглядеть так:

<Rectangle Visibility="{Binding TipRoundingHasError, FallbackValue=DEFAULTVALUE, Converter={StaticResource VisibilityConverter}}">

но я не помню сейчас, будет ли ваш конвертер вызываться в FallbackValue или нет. Это означает, что я не могу вам сейчас сказать, следует ли вам заменить DEFAULTVALUE на «Collapsed» или, скорее, на «False». Но я думаю, вы сразу же протестируете и выберете правильный.

Чтобы узнать больше о Fallback, попробуйте взглянуть на BindingBase.FallbackValue - есть хороший пример с настраиваемым классом привязки (да, не только преобразователи могут быть пользовательскими :))

1 голос
/ 07 июня 2011

Я сделал AppearingControl, чья реализация не поддается названию этого «кодирования», поскольку это так просто: `

public class AppearingControl : ContentControl
{
  public AppearingControl()
  {
    if( !System.ComponentModel.DesignerProperties.IsInDesignTool )
    {
      this.Visibility = System.Windows.Visibility.Collapsed;
      this.Loaded += new RoutedEventHandler( AppearingControl_Loaded );
    }
  }

  void AppearingControl_Loaded( object sender, RoutedEventArgs e )
  {
    this.Loaded -= new RoutedEventHandler( AppearingControl_Loaded );

    this.ClearValue( AppearingControl.VisibilityProperty );
  }
}

Я могу использовать элемент управления следующим образом:

<slim:AppearingControl HorizontalContentAlignment="Stretch" 
                       VerticalContentAlignment="Stretch">
    <Rectangle Visibility="{Binding TipRoundingHasError, Converter={StaticResource VisibilityConverter}}">
        <Rectangle.Fill>
            <SolidColorBrush Color="#FFFF4040" Opacity="0.5"/>
        </Rectangle.Fill>
    </Rectangle>
</slim:AppearingControl>

Можеткто-то подтвердил, что я не просто заново изобрел колесо, или, что еще хуже, использовал базуку, чтобы убить муху?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...