2011-02-09 3 views
1

확인란과 listview를 함께 연결하려고 시도하고 바인딩 방법을 사용하여 개체의 경로를 설정하여 목록 상자에서 확인란의 IsChecked 상태를 설정합니다. 내가 일어날 필요가있는 무엇wpf listbox 확인란 조합, 정말 붙어

List<Test1> datas = new List<Test1>(); 

var data = new Test1 {Key = 1, Value = "Hello", IsSelected= true}; 
    datas.Add(data); 
    data = new Test1 {Key = 2, Value = "Hello2", IsSelected= false}; 
    datas.Add(data); 

체크 박스는 다음 (에 isSelected가 true) 선택되어 있다면 클릭하고 나는 또한 선택을 필요로하는 GUI의 체크 박스를 해제합니다 때 다음 그 값을 채우고 필요가있다 태그 속성으로 이동할 수 있도록 적절한 listeview 항목.

아래의이 코드는 IsChecked 확인란을 설정하지 않습니다.

<ListBox ItemsSource="{Binding}" Name="lstSwimLane" Width="225" Height="125" SelectionChanged="lstSwimLane_SelectionChanged"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected, Mode=TwoWay}" 
              Checked="CheckBox_Checked" 
              Unchecked="CheckBox_Unchecked" /> 
       <TextBlock Text="{Binding Path=Value}"></TextBlock> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

개체의 값으로 확인란을 설정하려면 무엇을 변경해야합니까? 나는 심지어 INotifyChange 등을 시도했다 ...

여기도 마찬가지이다.

public class Test1 : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private bool _isChecked; 

    public int Key { get; set; } 
    public string Value { get; set; } 

    public bool IsSelected 
    { 
     get { return _isChecked; } 
     set 
     { 
      if(_isChecked != value) 
      { 
       _isChecked = value; 
       OnPropertyChanged("IsSelected"); 
      } 
     } 
    } 

    protected void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 

나는이 모든 wpf에 익숙하지 않다.

감사합니다.

+0

문제를 해결할 때 행운이 있습니까? 나는 당신의 질문을 정확하게 이해 했습니까? 내가 뭔가를 명확히해야하는지 알려주지 –

+0

아직도 붙어있다. – nitefrog

답변

6

"3 자 작동"이 필요합니까? 그래서

  • ListBoxItem.IsSelected
  • CheckBox.IsChecked
  • Item1.IsSelected

이 다른 속성을 모두 영향을주는 세 가지 속성

의 설정? 불행히도 WPF에는 그러한 바인딩이 없으므로 약간의 추가 작업을해야합니다.


으로 로버트 Rossney에 의해 지적
업데이트, 이것에 대한 더 나은 솔루션은

  • ListBoxItem.IsSelectedItem1.IsSelected-
  • CheckBox.IsChecked XAML 업데이트 ListBoxItem.IsSelected

에 결합하는 것입니다

<ListBox ItemsSource="{Binding}" 
     Name="lstSwimLane" 
     SelectionMode="Multiple" 
     Width="225" Height="125" SelectionChanged="lstSwimLane_SelectionChanged"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="IsSelected" 
       Value="{Binding Path=IsSelected, 
           Mode=TwoWay}"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox Checked="CheckBox_Checked" 
          Unchecked="CheckBox_Unchecked" 
          IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, 
               Path=IsSelected}"> 
       </CheckBox> 
       <TextBlock Text="{Binding Path=Value}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+1

다중 바인딩 또는 이벤트 처리기 또는 값 변환기가 필요한 이유가 없습니다. 'CheckBox.IsChecked'를'ItemTemplate'의'ListBoxItem.IsSelected'에 바인딩하고'ItemBoxItem.IsSelected'를'ItemContainerStyle'의'Item1.IsSelected'에 바인드 할 수 있어야합니다.나는 나 자신을 시도하지 않았다. (나는이 머신에서 VS를 가지고 있지 않다.)하지만 확실히 작동해야한다. –

+0

@ Robert Rossney : 당신이 옳을 수도 있습니다. 나는 다른 방법으로 시작해서 일부 조합이 작동하지 않는다는 것을 알았습니다. 나는 내 컴퓨터에있을 때 다시 시도 할 것이다. 그러나 어떤 이벤트 핸들러도 관련이 없었습니다. –

+0

@ 로버트 로스 니 : 시도해 봤는데 훌륭하게 작동했습니다. 귀하의 솔루션은 제 것보다 훨씬 뛰어 났으므로 여기에 크레딧을받을 자격이 있습니다. 답으로 게시해야한다고 생각하십시오. 어쨌든 좋은 일! –

0

누구나 관심이있는 경우 여기에 listbox/combox에 대한 마크 업이 있습니다. 가로로 표시됩니다.

큰 도움을 주신 모든 분들께 다시 한번 감사드립니다.

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
     ItemsSource="{Binding}" 
     Name="lstSwimLane" 
     SelectionMode="Multiple" 
     Width="auto" 
     Height="auto" 
     Background="Transparent" 
     BorderThickness="0" 
     SelectionChanged="lstSwimLane_SelectionChanged" > 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel IsItemsHost="True" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 

    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="IsSelected" Value="{Binding Path=IsChecked, Mode=TwoWay}"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 

    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" Margin="3,3,3,3"> 
       <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" 
          Checked="CheckBox_Checked" 
          Unchecked="CheckBox_Unchecked" 
          VerticalAlignment="Center" 
          Margin="0,0,4,0" /> 
       <TextBlock Text="{Binding Value}" VerticalAlignment="Center"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox>