То, что я пытаюсь получить
Код для этого здесь https://hastebin.com/uqumowediq.xml
Обратите внимание, как это использует RadioButton для отслеживаниясвойство проверять, является ли оно истинным или ложным.
Это, однако, не относится к моему UserControl, который построен на ListBox, с моим ListBox, я хочу иметь возможность получать данные выбранных элементов в виде EntryItemViewModel
что легко, я бы изменил тип для свойства Dependency, чтобы он возвращал SelectedItem как EntryItemViewModel.
Однако я хочу выдвинуть StackPanel, как в gif, представленном выше, с текстовым полем на нем, чтобы я мог связатьсвойство Title
для свойства Text
этого текстового поля.Это опять легко.
Моя проблема в том, что ... Когда я щелкаю элемент в ListBox, я хочу, чтобы он сдвинул StackPanel в сторону.Снова, как на картинке выше, и когда я выбираю другой, он снова вставляется, а затем снова представляет новые данные, но это будет то же самое окно.
То, что у меня сейчас есть, это следующее.
Мой UserControl
d:DesignHeight="300"
d:DesignWidth="300"
Height="535">
<Grid Background="LightGray">
<ListBox SelectionMode="Single"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
x:Name="TheListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<Border Grid.Column="2" Padding="0,0,8,0">
<Grid>
<Grid.ColumnDefinitions>
<!-- Selected Item -->
<ColumnDefinition Width="Auto"/>
<!-- Image Item -->
<ColumnDefinition Width="Auto"/>
<!-- Main content-->
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- Item image -->
<Border Grid.Column="1" Padding="8">
<Image Source="{Binding Image}"
UseLayoutRounding="True"
RenderOptions.BitmapScalingMode="Fant"
Height="40"
Width="40"/>
</Border>
<!-- Main Content -->
<Border Grid.Column="2" Padding="0,0,8,0">
<StackPanel VerticalAlignment="Center">
<!-- Main Content -->
<TextBlock Text="{Binding Title, FallbackValue=Title}"
TextTrimming="CharacterEllipsis"
FontWeight="Bold"/>
<!-- Main Content -->
<TextBlock Text="{Binding Username, FallbackValue=Username}"
TextTrimming="CharacterEllipsis"/>
<!-- Website URl -->
<TextBlock Text="{Binding Password, FallbackValue=https://facebook.com}" Foreground="Gray"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
</Border>
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="Border"
BorderBrush="Transparent"
BorderThickness="5,0,0,0">
<ContentPresenter Margin="0,0,0,0" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="BorderBrush" Value="LightSkyBlue" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0.0" To="1.0" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</Grid>
Вслед за UserControls cs
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
//Not sure what type this should be yet, I think this plays a big roll for this issue
public bool SelectedItem
{
get { return (bool)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("SelectedItem", typeof(bool), typeof(MyUserControl));
}
Я представляю UserControl в MainWindow, и именно там я храню StackPanel, который собираетсявыдвигается, а пока это просто куб.
<Grid>
<Grid.Resources>
<system:Double x:Key="SlideOffSet">50</system:Double>
<Storyboard x:Key="SlideRight">
<DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
From="0" To="{StaticResource SlideOffSet}"
Duration="0:0:0.2" />
</Storyboard>
<Storyboard x:Key="SlideLeft">
<DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
From="{StaticResource SlideOffSet}" To="0"
Duration="0:0:0.2" />
</Storyboard>
</Grid.Resources>
<local:MyUserControl x:Name="UserControl"/>
<StackPanel Width="100"
Height="100"
Background="Gray">
<StackPanel.Style>
<Style TargetType="StackPanel">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=UserControl, Path=SelectedItem}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource SlideRight}" />
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource SlideLeft}" />
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<StackPanel.RenderTransform>
<TranslateTransform />
</StackPanel.RenderTransform>
</StackPanel>
</Grid>
А для EntryItemViewModel.cs у нас есть это
public class EntryItemViewModel : INotifyPropertyChanged
{
private string _title;
public string Title
{
get { return _title; }
set { _title = value; }
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
И, наконец, AllEntriesViewModel.cs
public class AllEntriesListViewModel : INotifyPropertyChanged
{
public ObservableCollection<EntryItemViewModel> Items { get; set; } = new ObservableCollection<EntryItemViewModel>();
public EntryItemViewModel EntryItemViewModel { get; set; } = new EntryItemViewModel();
public AllEntriesListViewModel()
{
Items.Add(new EntryItemViewModel { Title = "Hello World" });
Items.Add(new EntryItemViewModel { Title = "Hello World1" });
Items.Add(new EntryItemViewModel { Title = "Hello World2" });
Items.Add(new EntryItemViewModel { Title = "Hello World3" });
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Для DataContext задан новый экземпляр AllEntriesItemViewModel