我有一个 ListBox
,作为这样的:
<ListBox
//other stuff
ItemsSource="{Binding ViewModels, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedThing, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Purple" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
ViewModel.cs:
public SomeType SelectedThing
{
get => selectedThing;
set => //set with INotifyPropertyChanged
}
public ObservableCollection<SomeType> ViewModels
{
get => viewModels;
set => //set with INotifyPropertyChanged
}
这有可能是 SelectedThing
定义 ViewModel
当装载的程序,所以我希望它是相应的样式。
它的伟大工程,当我打开应用程序,然后点击一个项目,但如何能的风格应用上的负担?
我试图:
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnabled, RelativeSource={RelativeSource Mode=Self}}" Value="True">
<Setter Property="Background" Value="Purple" />
</DataTrigger>
</Style.Triggers>
但每个项目的 ListBox
启用,因此它应用于每一个项目,在负荷。
编辑:
经过调试一下,我找到出,当设置 SelectedThing
在载荷, SelectedItem
仍然是 null
.
编辑:
这里是的 OnLoaded
方法在 ViewModel
,我在哪里设置 SelectedThing
如果用户选择它,而以前使用的应用程序。 目的是让选择之后关闭和重新开放该程序。
public IAsyncRelayCommand OnLoadedCommand { get; set; }
在构造:
OnLoadedCommand = new AsyncRelayCommand(OnLoaded);
在查看:
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding OnLoadedCommand}" />
</b:EventTrigger>
</b:Interaction.Triggers>
实际的方法:
public async Task OnLoaded()
{
//other stuff
if (App.Current.Properties.Contains(nameof(SelectedThing)))
{
var selected = JsonConvert.DeserializeObject<SomeType>(App.Current.Properties[nameof(SelectedThing)].ToString());
SelectedThing = selected;
}
}