xmlns:hc="https://handyorg.github.io/handycontrol"
using HandyControl;
多选组合框 CheckComboBox
<hc:CheckComboBox x:Name="CheckComboBoxInfo" Margin="5" ShowClearButton="True" ShowSelectAllButton="True" IsEnabled="True"
Width="300" Style="{StaticResource CheckComboBoxPlus}"
ItemsSource="{Binding LabelGroupSource}"
SelectedValuePath="Key" DisplayMemberPath="Value">
<hc:CheckComboBox.ItemContainerStyle>
<Style TargetType="{x:Type hc:CheckComboBoxItem}" BasedOn="{StaticResource CheckComboBoxItemBaseStyle}">
<Setter Property="IsSelected" Value="{Binding IsChecked}"/>
</Style>
</hc:CheckComboBox.ItemContainerStyle>
</hc:CheckComboBox>
<Button Content="Save" Command="{Binding SaveCommand}"
CommandParameter="{Binding ElementName=CheckComboBoxInfo, Path=SelectedItems}"/>
// ViewModel
public ObservableCollection<CheckedSource> LabelGroupSource { get; set; }
// 数值初始化
LabelGroupSource[0].IsChecked = true;
LabelGroupSource[1].IsChecked = true;
LabelGroupRefreshEvent?.Invoke(this, EventArgs.Empty);
/// <summary>
/// 更新标签显示
/// </summary>
public event EventHandler LabelGroupRefreshEvent;
public DelegateCommand<object> SaveCommand => new DelegateCommand<object>(ExecuteSaveCommand);
void ExecuteGroupImportCommand(object obj)
{
_dependency.ShowInfo("Save");
}
// .cs 更新View
private void Vm_LabelGroupRefreshEvent(object sender, System.EventArgs e)
{
CheckComboBoxInfo.OnApplyTemplate();
}
扩展 SelectedItems
默认的SelectedItems是非依赖属性,不能进行绑定,可以通过附加属性进行扩展支持。
<ctl:CheckComboBoxEx Width="500" Height="40"
Style="{StaticResource CheckComboBoxPlus}"
ItemsSource="{Binding SourceList}" comm:CheckComboBoxHelper.SelectedItems="{Binding SelectedItems}"/>
// ViewModel
SourceList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
SelectedItems = new List<int> { 6, 8, 9, 0 };
注意,SelectedItems的数据应该是SourceList 的一部分。
using HandyControl.Controls;
using System.Collections;
using System.Windows;
using System.Windows.Controls;
public class CheckComboBoxHelper
{
public static IList GetSelectedItems(DependencyObject obj)
{
return (IList)obj.GetValue(SelectedItemsProperty);
}
public static void SetSelectedItems(DependencyObject obj, int value)
{
obj.SetValue(SelectedItemsProperty, value);
}
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.RegisterAttached("SelectedItems", typeof(IEnumerable), typeof(CheckComboBoxHelper), new PropertyMetadata(null, OnSelectedItemsChanged));
private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is CheckComboBox cbox)
{
if (e.OldValue != null)
{
cbox.SelectionChanged -= OnSelectionChanged;
}
if (e.NewValue is IList list)
{
cbox.SelectedItems.Clear();
if (list != null)
{
foreach (var item in list)
{
cbox.SelectedItems.Add(item);
}
cbox.OnApplyTemplate();
cbox.SelectionChanged += OnSelectionChanged;
}
}
}
}
private static void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var dataSource = GetSelectedItems(sender as DependencyObject);
// 添加用户选中的项
foreach (var item in e.AddedItems)
{
dataSource.Add(item);
}
// 删除用户取消选中的项
foreach (var item in e.RemovedItems)
{
dataSource.Remove(item);
}
}
}
TabControl
Header大小
<Style x:Key="TabItemSizeStyleEx" TargetType="TabItem" BasedOn="{StaticResource TabItemInLine}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Path=Header, RelativeSource={RelativeSource AncestorType=TabItem}}" FontSize="20"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
标记 Badge
<DataGridTemplateColumn Header="标记">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<hc:Badge Status="Dot" Margin="0,0,0,0" BadgeMargin="0,0,5,0" VerticalAlignment="Center"
Background="Red"/>
<TextBlock Text="{Binding XXX}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>