मैं एक 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
जब app लोड हो रहा है, तो मैं यह चाहते हैं होना करने के लिए स्टाइल के हिसाब से.
यह महान काम करता है जब मैं app खुला और फिर एक आइटम पर क्लिक करें, लेकिन कैसे कर सकते हैं शैली पर लागू किया जाएगा ।
मैं के साथ की कोशिश की:
<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;
}
}