如何访问datatemplate中的标签

时间:2012-03-23 06:55:09

标签: wpf wpf-controls

大家好我有一个列表框,其中是一个datatemplate.Inside它是复选框,文本框,标签...我想要的是获取标签的值,如果未选中该复选框?或任何替代方法,如何访问标签值,但只有未选中复选框............请帮助我。 代码是

<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>

2 个答案:

答案 0 :(得分:1)

由于您在标签上使用绑定,我将从datatemplate描述的对象访问subject_id。像这样:

var subjectId = dataBoundItem.subject_id;

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

<强>更新

这是解决此问题的基本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>

此处,每当单个ListBoxItem上的值IsSelected发生更改时,viewModel的“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将设置为true;如果未选中,则IsSelected将设置为false。您可以将代码放入“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和绑定。

答案 1 :(得分:0)

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