风格SelectedItem在列表框吁载WPF

0

的问题

我有一个 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;
    }
}
c# listbox mvvm wpf
2021-11-23 14:48:35
1

最好的答案

2

为什么没有选择的项目是因为你设置的 SelectedThing 来源财产的价值不在 ViewModels 来源收集。

因为你已经发现,这一工作更好:

var selectedViewModel = ViewModels.Where(x => x.SelectedThing == selected.SelectedThing).FirstOrDefault();
SelectedThing = selectedViewModel;

该项目被选中必须存在来源收集。

2021-11-24 15:36:53

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................