Как получить доступ к метке внутри таблицы данных
Привет всем, у меня есть список, в котором есть табличка с данными. Внутри это флажок, текстовое поле, метка... Что я хочу, чтобы получить значение метки, когда флажок снят? или любой другой способ доступа к значению метки, но только если флажок снят............ Пожалуйста, помогите мне. код как
<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 ответа
Так как вы используете привязку к метке, я бы пошел для доступа к 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>
Здесь всякий раз, когда значение IsSelected для отдельного ListBoxItem изменяется, привязка "IsSelected" viewModel изменяется. Вот модель:
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, когда выбран соответствующий элемент, и в false, если он не выбран. Вы можете поместить свой код в элемент "set" свойства "IsSelected" и проверить (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 и привязках.
Как насчет использования Checked
а также UnChecked
события вашего CheckBox, так что вы можете получить значение subject_id
который привязан к вашей этикетке.