Я пытаюсь создать «ModalPopup» пользовательский элемент управления со следующими характеристиками:Wpf таможенного контроля с позиций ребенка
- Он имеет Main Content Area
Content
, которая всегда отображается. - У него есть коллекция детей
PopupItems
элементы, которые отображаются (по тексту) поверх верхней части основной области содержимого с полупрозрачной рамкой, которая охватывает основную область содержимого. - Если у какого-либо из элементов «Дети» установлено значение «
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>