2016-01-18 2 views
0

Я пытаюсь создать «ModalPopup» пользовательский элемент управления со следующими характеристиками:Wpf таможенного контроля с позиций ребенка

  1. Он имеет Main Content Area Content, которая всегда отображается.
  2. У него есть коллекция детей PopupItems элементы, которые отображаются (по тексту) поверх верхней части основной области содержимого с полупрозрачной рамкой, которая охватывает основную область содержимого.
  3. Если у какого-либо из элементов «Дети» установлено значение «IsShown», оно будет отображаться, и область основного содержимого будет отключена.

Я получил эту работу, но я продолжаю получать ошибки в конструкторе, как A value of type ‘ModalPopupItem’ cannot be added to a collection or dictionary of type ‘ObservableCollection’. я попытался с помощью UIElementCollection, список, список, и я до сих пор продолжаю получать ошибки. Также конструктор не отражает никаких изменений, которые я делаю в xaml, пока не перекомпилю, что крайне расстраивает.

Что я могу сделать, чтобы заставить дизайнера прекратить эти ошибки?


ModalPopup:

public class ModalPopup: ContentControl 
    { 
     public ModalPopup() 
     { 
      this.PopupItems = new ObservableCollection<ModalPopupItems>(); 
      this.Loaded += ModalPopup_Loaded; 
     } 

     private void ModalPopup_Loaded(object sender, RoutedEventArgs e) 
     { 
      foreach (ModalPopupItem item in this.PopupItem) 
      { 
       Item.IsShownChanged += Item_IsShownChanged; 
      } 
      UpdateOverlay(); 
     } 

     public static readonly DependencyProperty ShowOverylayProperty = 
     DependencyProperty.Register.(“ShowOverlay”, typeof(bool), typeof(ModalPopup), new PropertyMetadata(true)); 
     public bool ShowOverlay 
     { 
      get {return (bool)GetValue(ShowOverlayProperty);} 
      set {SetValue(ShowOverlayProperty, value);} 
     } 

     public static readonly DependencyProperty PopupItemsProperty = 
     DependencyProperty.Register.(“PopupItems”, typeof(ObservableCollection<ModalPopupItem>), typeof(ModalPopup)) 
     public ObservableCollection<ModalPopupItem>ShowOverlay 
     { 
      get {return (ObservableCollection<ModalPopupItem>)GetValue(ShowOverlayProperty);} 
      set {SetValue(ShowOverlayProperty, value);} 
     } 

     private void UpdateOverlay() 
     { 
      ShowOverlay = (PopupItems?.Any(item => item.IsShown) ?? false); 
     } 

     private void item_IsShownChanged(object sender, EventArgs e) 
     { 
      UpdateOverlay(); 
     } 
    } 

ModalPopupItem:

public class ModalPopupItem: ContentControl 
    { 
      public EventHandler IsShownChanged; 

      public static readonly DependencyProperty IsShownProperty = 
      DependencyProperty.Register(“IsShown”, typeof(bool), typeof(ModalPopupItem), new PropertyMetadata(true, IsShownChanged_Callback)); 
      Public bool IsShown 
      { 
        get { return (bool)GetValue(IsShownProperty); } 
        set { SetValue(IsShownProperty, value); } 
      } 

      private static void IsShownChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
      { 
         (d as ModalPopupItem).Visibility = (bool)e.NewValue ? Visibility.Visible : Visibility.Collapsed; 
         (d as ModalPopupItem).IsShownChanged?.Invoke(d, EventArgs.Empty); 
      } 
    } 

Ресурсы Файл:

<Style TargetType=”local:ModalPopup”> 
      <Style.Setters> 
       <Setter Property="Template"> 
        <Setter.Value> 
          <ControlTemplate TargetType="local:ModalPopup"> 
           <Grid> 
            <ContentPresenter Content="TemplateBinding Content}" 
                IsEnabled="{TemplateBinding ShowOverlay, Converter={StaticResource InvertBool}}" /> 
            <ContentControl Template="{StaticResource PopupTemplate}" 
                Visibility="{TemplateBinding ShowOverlay, Converter={StaticResource TrueToVisible}}"> 
             <ItemsControl ItemsSource="{TemplateBinding PopupItems}" /> 
            </ContentControl> 
          </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style.Setters> 
    </Style> 

Вот как мой контроль используется ....

<local:ModalPopup> 
     <!-- Main Content Area --> 
     <TextBlock Text="Main Content" Height=“200” Width=”200” /> 

     <!-- Popup Items --> 
     <local:ModalPopup.PopupItems> 
      <local:ModalPopupItem IsShown="False">Popup 1</ local:ModalPopupItem> 
      <local:ModalPopupItem IsShown="True">Popup 2</ local:ModalPopupItem> 
      <local:ModalPopupItem IsShown="{Binding ShowPopup3}">Popup 3</ local:ModalPopupItem> 
     </local:ModalPopup.PopupItems> 
    </local:ModalPopup> 

ответ

0

Также дизайнер не отражает изменения, внесенные в XAML, пока я не перекомпилировать, что крайне сложно.

Это нормальное поведение и как работает дизайнер.

https://msdn.microsoft.com/en-us/library/114xc3e5(v=vs.90).aspx

Я получил эту работу, но я продолжаю получать ошибки в конструкторе, как значение типа «ModalPopupItem» не может быть добавлен в коллекцию или словарь типа «ObservableCollection».

Не уверен в этом, но если он скомпилируется и работает, я попытаюсь проанализировать, что происходит во время выполнения. Visual Studio имеет отличные инструменты, разработанные для этого.

Смежные вопросы