Skip to content

Commit cea814b

Browse files
committed
Adding support for ItemContainerTemplateSelector etc.
1 parent dec1659 commit cea814b

File tree

3 files changed

+93
-4
lines changed

3 files changed

+93
-4
lines changed

Changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@
6969
- Selecting an `RibbonTabItem` brings it into view now
7070
- Improved keyboard navigation inside `BackstageTabControl`
7171
- Improved mouse wheel selection on `RibbonTabControl`
72+
- `MenuItem`
73+
- Added support for `UsesItemContainerTemplate` and `ItemContainerTemplateSelector`
74+
- `DropDownButton`
75+
- Added support for `UsesItemContainerTemplate` and `ItemContainerTemplateSelector`
7276

7377
- ### Bug fixes
7478

Fluent.Ribbon/Controls/DropDownButton.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,64 @@ public override void OnApplyTemplate()
482482

483483
#region Overrides
484484

485+
/// <summary>Gets or sets the custom logic for choosing a template used to display each item.</summary>
486+
/// <returns>A custom object that provides logic and returns an item container.</returns>
487+
public ItemContainerTemplateSelector? ItemContainerTemplateSelector
488+
{
489+
get => (ItemContainerTemplateSelector?)this.GetValue(StatusBar.ItemContainerTemplateSelectorProperty);
490+
set => this.SetValue(StatusBar.ItemContainerTemplateSelectorProperty, value);
491+
}
492+
493+
/// <summary>Gets or sets a value that indicates whether the menu selects different item containers, depending on the type of the item in the underlying collection or some other heuristic.</summary>
494+
/// <returns>
495+
/// <see langword="true" /> the menu selects different item containers; otherwise, <see langword="false" />.
496+
///
497+
/// The registered default is <see langword="false" />. For more information about what can influence the value, see Dependency Property Value Precedence.</returns>
498+
public bool UsesItemContainerTemplate
499+
{
500+
get => (bool)this.GetValue(StatusBar.UsesItemContainerTemplateProperty);
501+
set => this.SetValue(StatusBar.UsesItemContainerTemplateProperty, value);
502+
}
503+
504+
private object? currentItem;
505+
506+
/// <inheritdoc />
507+
protected override bool IsItemItsOwnContainerOverride(object item)
508+
{
509+
if (base.IsItemItsOwnContainerOverride(item))
510+
{
511+
return true;
512+
}
513+
514+
if (this.UsesItemContainerTemplate)
515+
{
516+
this.currentItem = item;
517+
}
518+
519+
return false;
520+
}
521+
522+
/// <inheritdoc />
523+
protected override DependencyObject GetContainerForItemOverride()
524+
{
525+
if (this.UsesItemContainerTemplate is false)
526+
{
527+
this.currentItem = null;
528+
return base.GetContainerForItemOverride();
529+
}
530+
531+
var item = this.currentItem;
532+
this.currentItem = null;
533+
534+
var dataTemplate = this.ItemContainerTemplateSelector?.SelectTemplate(item, this);
535+
if (dataTemplate is not null)
536+
{
537+
return dataTemplate.LoadContent();
538+
}
539+
540+
return base.GetContainerForItemOverride();
541+
}
542+
485543
private void OnDropDownPopupKeyDown(object sender, KeyEventArgs e)
486544
{
487545
if (e.Handled)

Fluent.Ribbon/Controls/MenuItem.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -410,16 +410,43 @@ public void OnKeyTipBack()
410410

411411
#region Overrides
412412

413+
private object? currentItem;
414+
413415
/// <inheritdoc />
414-
protected override DependencyObject GetContainerForItemOverride()
416+
protected override bool IsItemItsOwnContainerOverride(object item)
415417
{
416-
return new MenuItem();
418+
if (item is MenuItem or Separator)
419+
{
420+
return true;
421+
}
422+
423+
if (this.UsesItemContainerTemplate)
424+
{
425+
this.currentItem = item;
426+
}
427+
428+
return false;
417429
}
418430

419431
/// <inheritdoc />
420-
protected override bool IsItemItsOwnContainerOverride(object item)
432+
protected override DependencyObject GetContainerForItemOverride()
421433
{
422-
return item is FrameworkElement;
434+
if (this.UsesItemContainerTemplate is false)
435+
{
436+
this.currentItem = null;
437+
return new MenuItem();
438+
}
439+
440+
var item = this.currentItem;
441+
this.currentItem = null;
442+
443+
var dataTemplate = this.ItemContainerTemplateSelector.SelectTemplate(item, this);
444+
if (dataTemplate is not null)
445+
{
446+
return dataTemplate.LoadContent();
447+
}
448+
449+
return new MenuItem();
423450
}
424451

425452
#region Non MenuBase ItemsControl workarounds

0 commit comments

Comments
 (0)