2016-10-05 4 views
0

私は比較的フレッシュで、XAMLを発見しています。リストボックスから選択したアイテムのみを新しいリストに表示

XAMLにはListBox Name="EmployeeTitles"が1つあります(下記参照)。問題を具体的に示す目的で、ObservableCollection<Employee>というDataContext = employeesがあります。

 <ListBox Name="EmployeeTitles" 
      ItemsSource="{Binding}" 
      SelectionMode="Extended"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <ToggleButton IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"> 
          <!--StackPanel will have more items--> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding Title}"/> 
          </StackPanel>       
         </ToggleButton> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

次のように私の「背後にあるコード」クラススニペットが見えます:

private string _title; 
public string Title 
{ 
    get { return _title; } 
    set 
    { 
     _title = value; 
     OnPropertyChanged(); 
    } 
} 

private bool _isSelected; 
public bool IsSelected 
{ 
    get 
    { 
     return _isSelected; 
    } 
    set 
    { 
     _isSelected = value; 
     OnPropertyChanged(); 
    } 
} 

私は別のコントロールで選択した項目を表示したいと思います。たとえば、選択した項目のみを表示するリストがあります。 XAMLでIsChecked="True"のアイテムだけを表示したいと思っているとマークすることはできますか? IsSelectedのプロパティが変更されるたびに、選択された項目だけを格納して「コードビハインド」で更新する別のObservableCollectionを持つことができますが、オーバーヘッドのように思えますし、XAMLでそれを行う方法があるはずです。

答えて

3

他のリストボックスを元のリストボックスの選択した項目とバインドすることができます。以下のコードを試してみてください。

<Grid> 
    <StackPanel Orientation="Horizontal"> 
     <ListBox x:Name="Emp" ItemsSource="{Binding EmpCollection}" SelectionMode="Extended"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <ToggleButton IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"> 
          <!--StackPanel will have more items--> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding Title}"/> 
          </StackPanel> 
         </ToggleButton> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <ListBox x:Name="SelectedEmp" ItemsSource="{Binding ElementName=Emp,Path=SelectedItems}" DisplayMemberPath="Title"/> 
    </StackPanel> 
</Grid> 
public partial class Window2 : Window 
{ 
    public Window2() 
    { 
     InitializeComponent(); 
     this.DataContext = new ViewModel(); 
    } 
} 


class ViewModel 
{ 
    public ObservableCollection<Emp> EmpCollection { get; set; } 

    public ViewModel() 
    { 
     EmpCollection = new ObservableCollection<Emp>(); 
     for (int i = 0; i < 10; i++) 
     { 
      EmpCollection.Add(new Emp() {Title = "Title"+i}); 
     } 
    } 

} 

class Emp:INotifyPropertyChanged 
{ 
    private string _title; 
    public string Title 
    { 
     get { return _title; } 
     set 
     { 
      _title = value; 
      OnPropertyChanged(); 
     } 
    } 

    private bool _isSelected; 
    public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 
     set 
     { 
      _isSelected = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 

    } 
} 
+0

あなたは 'ListBox.SelectedItems'をバインドすることはできません。 –

+1

要素バインディングを使用することができます..私の完全なコードを試してください.. –

+0

私は修正されます。それはとても涼しいです。あなたはまだ何とかそれらをビューモデルに戻さなければなりません。 –

関連する問題