回答編集履歴

1 流れの説明

TN8001

TN8001 score 4229

2020/08/15 16:55  投稿

> 選択されているというのが重要な情報の場合(ファイルに選択情報も保存して次回復元する等)は、別の手のほうがいいかもしれません。  
 
> Taskクラスにbool IsSelectedプロパティを用意して、lst_TitleではListBoxItemのIsSelectedにバインドし、lst_DetailではListBoxItemのVisibilityにバインドします。  
> どちらのListBoxもTaskListがソースですが、lst_Detailでは未選択のものは無いように見えます。  
> ちょっとずるいようですが、割とポピュラーな手段だと思います。もし気になるようでしたら追記しますので言ってください。  
 
1万字に収まらなかったのでこちらで失礼します。
 
IsSelectedにバインドパターン  
```xaml
<Window
 x:Class="Questions284783.Views.MainWindow"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:controls="clr-namespace:System.Windows.Controls;assembly=PresentationFramework"
 xmlns:prism="http://prismlibrary.com/"
 Width="525"
 Height="350"
 prism:ViewModelLocator.AutoWireViewModel="True">
 <Window.Resources>
   <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
 </Window.Resources>
 <Grid>
   <Grid.ColumnDefinitions>
     <ColumnDefinition />
     <ColumnDefinition Width="2*" />
   </Grid.ColumnDefinitions>
   <Grid.RowDefinitions>
     <RowDefinition Height="Auto" />
     <RowDefinition />
   </Grid.RowDefinitions>
   <Grid>
     <Grid.ColumnDefinitions>
       <ColumnDefinition Width="Auto" />
       <ColumnDefinition />
     </Grid.ColumnDefinitions>
     <Label
       Margin="5"
       VerticalAlignment="Center"
       Content="表題" />
     <TextBox
       Grid.Column="1"
       Margin="5"
       VerticalAlignment="Center"
       Text="{Binding Txt_Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
       TextWrapping="Wrap" />
   </Grid>
   <Grid Grid.Column="1">
     <Grid.ColumnDefinitions>
       <ColumnDefinition Width="Auto" />
       <ColumnDefinition />
       <ColumnDefinition Width="Auto" />
     </Grid.ColumnDefinitions>
     <Label
       Margin="5"
       VerticalAlignment="Center"
       Content="Memo" />
     <TextBox
       Grid.Column="1"
       Margin="5"
       VerticalAlignment="Center"
       Text="{Binding Txt_Memo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
       TextWrapping="Wrap" />
     <Button
       Grid.Column="2"
       MinWidth="56"
       Margin="5"
       Command="{Binding ExecuteCommand}"
       Content="追加" />
   </Grid>
   <Grid Grid.Row="1">
     <Grid.RowDefinitions>
       <RowDefinition Height="Auto" />
       <RowDefinition />
     </Grid.RowDefinitions>
     <ComboBox
       x:Name="comboBox"
       Margin="5"
       SelectedIndex="0">
       <controls:SelectionMode>Single</controls:SelectionMode>
       <controls:SelectionMode>Multiple</controls:SelectionMode>
       <controls:SelectionMode>Extended</controls:SelectionMode>
     </ComboBox>
     <ListBox
       x:Name="lst_Title"
       Grid.Row="1"
       Margin="5"
       DisplayMemberPath="Title"
       IsSynchronizedWithCurrentItem="True"
       ItemsSource="{Binding TaskList}"
       SelectionMode="{Binding SelectedValue, ElementName=comboBox}">
       <ListBox.ItemContainerStyle>
         <Style TargetType="ListBoxItem">
           <Setter Property="IsSelected" Value="{Binding IsSelected}" />
         </Style>
       </ListBox.ItemContainerStyle>
     </ListBox>
   </Grid>
   <ListBox
     Grid.Row="1"
     Grid.Column="1"
     Margin="5"
     ItemsSource="{Binding TaskList}">
     <ListBox.ItemContainerStyle>
       <Style TargetType="ListBoxItem">
         <Setter Property="Visibility" Value="{Binding IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}" />
       </Style>
     </ListBox.ItemContainerStyle>
     <ListBox.ItemTemplate>
       <DataTemplate>
         <StackPanel>
           <TextBlock FontWeight="Bold" Text="{Binding Title}" />
           <TextBlock Text="{Binding Detail}" />
         </StackPanel>
       </DataTemplate>
     </ListBox.ItemTemplate>
   </ListBox>
 </Grid>
</Window>
```
```C#
using System.Collections.ObjectModel;
using Prism.Commands;
using Prism.Mvvm;
namespace Questions284783.ViewModels
{
   public class MainWindowViewModel : BindableBase
   {
       private string txt_Title;
       public string Txt_Title
       {
           get => txt_Title;
           set { if(SetProperty(ref txt_Title, value)) ExecuteCommand.RaiseCanExecuteChanged(); }
       }
       private string txt_Memo;
       public string Txt_Memo
       {
           get => txt_Memo;
           set { if(SetProperty(ref txt_Memo, value)) ExecuteCommand.RaiseCanExecuteChanged(); }
       }
       public ObservableCollection<Task> TaskList { get; } = new ObservableCollection<Task>();
       public DelegateCommand ExecuteCommand { get; private set; }
       public MainWindowViewModel()
       {
           TaskList.Add(new Task { Title = "aaa", Detail = "111" });
           TaskList.Add(new Task { Title = "bbb", Detail = "222" });
           TaskList.Add(new Task { Title = "ccc", Detail = "333" });
           ExecuteCommand = new DelegateCommand(Execute, CanExecute);
       }
       private void Execute()
       {
           TaskList.Add(new Task { Title = Txt_Title, Detail = Txt_Memo });
           Txt_Title = "";
           Txt_Memo = "";
           ExecuteCommand.RaiseCanExecuteChanged();
       }
       private bool CanExecute() => !string.IsNullOrEmpty(Txt_Title);
   }
   public class Task : BindableBase
   {
       public string Title { get; set; }
       public string Detail { get; set; }
       private bool isSelected;
       public bool IsSelected { get => isSelected; set => SetProperty(ref isSelected, value); }
   }
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る