требуется подсвечивать текущий элемент
с помощью события нажания
<MultiBinding Converter="{StaticResource IsEqualsConverter}">
<Binding />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ToolBar}}" Path="DataContext.CurrentElement" />
</MultiBinding>
{RelativeSource Mode=PreviousData}
- у первого элемента он будет {x:Null}
public class SettingViewHost
{
public IReadOnlyCollection<SettingView>? Views { get; init; }
}
public class SettingView
{
public string? Name { get; init; }
public IReadOnlyCollection<ItemData>? Options { get; init; }
}
public class ItemData
{
public string? Name { get; init; }
public int GridRow { get; init; }
public int GridColumn { get; init; }
}
public class BooleanItemData : ItemData // TODO implement INotifyPropertyChanged and raise PropertyChanged in Value setter
{
public bool Value { get; set; }
}
public class StringItemData : ItemData // TODO implement INotifyPropertyChanged and raise PropertyChanged in Value setter
{
public string Value { get; set; } = string.Empty;
}
<DataTemplate DataType="{x:Type local:StringItemData}">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name, Mode=OneTime}" />
<TextBox Text="{Binding Value}" />
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:BooleanItemData}">
<CheckBox Content="{Binding Name, Mode=OneTime}" IsChecked="{Binding Value}" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:SettingView}">
<ItemsControl ItemsSource="{Binding Options}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid IsItemsHost="True">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="Grid.Column" Value="{Binding GridColumn, Mode=OneTime}" />
<Setter Property="Grid.Row" Value="{Binding GridRow, Mode=OneTime}" />
<Setter Property="Margin" Value="4" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</DataTemplate>
<DataTemplate DataType="{x:Type local:SettingViewHost}">
<StackPanel Orientation="Vertical">
<ComboBox Name="ComboBox" ItemsSource="{Binding Views}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type local:SettingView}">
<TextBlock Text="{Binding Name, Mode=OneTime}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ContentControl Content="{Binding ElementName=ComboBox, Path=SelectedItem}" />
</StackPanel>
</DataTemplate>
Почему это поле не передается через, передается null
CommandParameter="{Binding ElementName=selfUserControl,Path=Points, Mode=OneWay}">, selfUserControl x:Name элемента.
Находил примеры, там везде свойство ItemsSource, но такого свойства нету у Canvas
использовать условные конструкции для решения об отображении или неотображении тех или иных элементов GUI, либо иметь разные XAML-формы для разных групп пользователей
Height="*"
ставить для второй строки, той которую нужно растянуть. private static void OnObserveChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
var frameworkElement = (FrameworkElement)dependencyObject;
if ((bool)e.NewValue)
{
frameworkElement.SetBinding(ObservedWidthProperty, new Binding(nameof(FrameworkElement.ActualWidth)) { RelativeSource = RelativeSource.Self });
frameworkElement.SetBinding(ObservedHeightProperty, new Binding(nameof(FrameworkElement.ActualHeight)) { RelativeSource = RelativeSource.Self });
}
else
{
frameworkElement.ClearValue(ObservedWidthProperty);
frameworkElement.ClearValue(ObservedHeightProperty);
}
}
{TemplateBinding Background}
{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PressedBackground}
<GroupBox Header="" HorizontalAlignment="Left" Height="100" Margin="10,67,0,0" VerticalAlignment="Top" Width="772">
<StackPanel Name="ConfigsBox" />
</GroupBox>
<ListBox VirtualizingStackPanel.IsVirtualizing="True" ItemsSource="{Binding ...}" />
// CollectionView можно получить двумя способами:
// 1. Просто получить дефолтный вариант для коллекции
var collectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(Items);
// 2. Создать свой, тогда именно этот созданный collectionView надо передавать для биндинга в ItemsSource.
var collectionView = new ListCollectionView(Models);
// После, можно добавить фейковый элемент
collectionView.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;
public sealed class NewItemTemplateSelector : DataTemplateSelector
{
public DataTemplate ItemTemplate { get; set; }
public DataTemplate NewItemPlaceholderTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item == CollectionView.NewItemPlaceholder)
return NewItemPlaceholderTemplate;
return ItemTemplate;
}
}
<ListBox.ItemTemplateSelector>
<t:NewItemTemplateSelector>
<t:NewItemTemplateSelector.ItemTemplate>
<DataTemplate>
<!-- Шаблон обычного элемента -->
</DataTemplate>
</t:NewItemTemplateSelector.ItemTemplate>
<t:NewItemTemplateSelector.NewItemPlaceholderTemplate>
<DataTemplate>
<!-- Шаблон CollectionView.NewItemPlaceholder -->
<Button Content="+" />
</DataTemplate>
</t:NewItemTemplateSelector.NewItemPlaceholderTemplate>
</t:NewItemTemplateSelector>
</ListBox.ItemTemplateSelector>