2012-03-23 66 views
0

大家好我有一个列表框,其中是一个datatemplate.Inside它是复选框,文本框,标签...我想要的Wat是获得标签的价值复选框未选中?或者任何关于如何访问标签值的选择,但只有当复选框未被选中时............请帮助我。 代码为如何访问datatemplate内的标签

<ListBox.ItemTemplate>              
    <DataTemplate> 
     <StackPanel Name="sp" Orientation="Horizontal" Margin="3,3,3,3" >              
      <CheckBox Name="chkSubject" IsChecked="{Binding RelativeSource{RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" VerticalAlignment="Center" Margin="0,0,4,0" Unchecked="chkSubject_Unchecked"> 
       <TextBlock FontSize="11" Text="{Binding subject_name}" /> 
      </CheckBox> 
      <Label Name="lbl_idOfSub" Content="{Binding subject_id}" Visibility="Visible"> 
      </Label> 
     </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

回答

1

由于您使用的标签绑定,我会去从DataTemplate中被描述的对象访问subject_id。像这样:

var subjectId = dataBoundItem.subject_id; 

这是使用MVVM和绑定的正确方法。

UPDATE:

这里是基本的MVVM的方法来解决这个问题。首先,我清理了一下你的列表框声明,并增加了一个触发器,设置IsSelected结合:

<ListBox ItemsSource="{Binding}"> 
     <ListBox.Resources> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> 
      </Style> 
     </ListBox.Resources> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Name="sp" Orientation="Horizontal" Margin="3,3,3,3" > 
        <CheckBox Name="chkSubject" IsChecked="{Binding IsSelected}" VerticalAlignment="Center" Margin="0,0,4,0" Unchecked="chkSubject_Unchecked_1"> 
         <TextBlock FontSize="11" Text="{Binding SubjectName}" /> 
        </CheckBox> 
        <Label Name="lbl_idOfSub" Content="{Binding SubjectId}" Visibility="Visible"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

在这里,每当IsSelected个人ListBoxItem的变化值,在“IsSelected”视图模型的结合改变。这里的模型:

public class SelectableItem : INotifyPropertyChanged 
{ 
    private string _subjectId; 
    private bool _isSelected; 
    private string _subjectName; 

    public string SubjectId 
    { 
     get { return _subjectId; } 
     set { _subjectId = value; OnPropertyChanged("SubjectId"); } 
    } 

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

    public string SubjectName 
    { 
     get { return _subjectName; } 
     set { _subjectName = value; OnPropertyChanged("SubjectName"); } 
    } 
    // .. INotifyPropertyChangedImplementation 

只要选择相关项目是您的IsSelected将被设置为真,假,只要它是不选。您可以将代码放入“IsSelected”属性的“set”项中,并检查(value == false),并根据需要执行必要的代码。这将是MVVM的方法。

使用的情况下,你可以做如下:

private void chkSubject_Unchecked_1(object sender, RoutedEventArgs e) 
    { 
     FrameworkElement control = sender as FrameworkElement; 
     if (control == null) 
      return; 

     SelectableItem item = control.DataContext as SelectableItem; 
     if (item == null) 
      return; 

     string yourValue = item.SubjectId; 
    } 

我强烈建议你阅读MVVM和绑定。

+0

谢谢。 Byways wat你的意思是由dataBoundItem.can你请给我一个可行的解决方案我的问题因为我坚持在这一点上。我想要的是复选框得到取消选中我想要的标签中的值。 – rohit 2012-03-23 08:35:56

+0

不客气:) 发布了解决方案的更新。 – 2012-03-23 19:02:45

+0

谢谢德米特里为你提供的帮助,这非常有用....肯定会阅读它..... :) – rohit 2012-03-25 06:42:18

0

如何使用CheckBox的CheckedUnChecked事件,以便您可以检索绑定到您的标签的subject_id的值。