Доступ к пользовательскому элементу управления ListBoxItem и управление им - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть список, в который я разбираю информацию из файла XML.Я создал пользовательский элемент управления для моих ListBoxItems, который состоит из флажка и текстового блока для хранения имен людей.Моя проблема в том, что я не могу получить доступ и контролировать элементы управления пользовательского элемента управления ListBoxItem в коде.Я не знаю, как получить к ним доступ.Я хочу, чтобы событие нажатия кнопки удаляло имена, которые не были проверены, и сохраняло имена, которые были проверены, в файл в IsolatedStorage.Я еще не работал над сохранением данных, потому что я хочу, чтобы сначала работала базовая «идентификация выбранного флажка».Не могли бы вы мне помочь?

Вот код:

    public partial class OppilasLista : PhoneApplicationPage

    {
        XDocument lista = XDocument.Load("NykyisetKurssit.xml");
        XDocument oppilasInfo = XDocument.Load("Oppilaat.xml");
        string id = string.Empty;

        public OppilasLista()
        {
            InitializeComponent();

        }

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            if (NavigationContext.QueryString.TryGetValue("id", out id))
            {

                var ryhma = (from ryhmaInfo in lista.Descendants("Kurssi")
                             where ryhmaInfo.Attribute("id").Value == id
                             select new Kurssit
                             {
                                 RyhmanNimi = (string)ryhmaInfo.Element("tunnus").Value

                             }).FirstOrDefault();

                PageTitle.Text = ryhma.RyhmanNimi;

                var oppilas = (from oppilaat in oppilasInfo.Descendants("Oppilas")
                               where oppilaat.Attribute("ryhma").Value == id
                               select new Kurssit
                               {
                                   OppilaanNimi = (string)oppilaat.Element("nimi").Value
                               });

                oppilaidenLista.ItemsSource = oppilas;

            }
            base.OnNavigatedTo(e);
        }

        private void Tallenna_Button_Click(object sender, RoutedEventArgs e)
        {

        }

    }

И XAML

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="LÄSNÄOLOT" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="{Binding RyhmanNimi}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ListBox ItemsSource="{Binding}" x:Name="oppilaidenLista" Margin="0,0" Height="500" VerticalAlignment="Top" d:LayoutOverrides="VerticalAlignment">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <local:ListboxItem />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <Button Content="Tallenna" Height="72" HorizontalAlignment="Left" Margin="12,506,0,0" Name="tallennaButton" VerticalAlignment="Top" Width="438" Click="Tallenna_Button_Click" />
        </Grid>
    </Grid>

И Пользовательский элемент управления ListBoxItem

    <Grid x:Name="LayoutRoot">
        <CheckBox Height="72" HorizontalAlignment="Left" Margin="0,7,0,0" Name="checkBox" VerticalAlignment="Top" />
        <TextBlock Height="55" HorizontalAlignment="Left" Margin="74,12,0,0" Name="studentName" Text= "{Binding OppilaanNimi}" VerticalAlignment="Top" Width="394" FontSize="40" />
    </Grid>

1 Ответ

1 голос
/ 08 февраля 2012

Я бы посоветовал вам связать ваш ListBox с набором элементов, которые имеют логическое свойство, с которым вы можете связать свойство CheckBox IsChecked.Что-то вроде:

public class Kurssit : INotifyPropertyChanged {
  private string _Oppilaanimi;
  private bool _IsChecked;

  public string OppilaanNimi {
    get { return _Oppilaanimi; }
    set {
      if (_Oppilaanimi != value) {
        _Oppilaanimi = value;
        PropertyChanged(this, new PropertyChangedEventArgs("OppilaanNimi"));
      }
  }

  public bool IsChecked {
    get { return _IsChecked ; }
    set {
      if (_IsChecked != value) {
        _IsChecked = value;
        PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
      }
  }

  public event PropertyChangedEventHandler PropertyChanged;
}

Когда вы создаете эти элементы в своем операторе LINQ, сохраняйте их в переменной-члене, скажем, private ObservableCollection<Kurssit> _Kurssit.

, а затем связывайте свой ListBoxк этой переменной-члену;

oppilaidenLista.ItemsSource = _Kurssit;

Затем измените свой пользовательский элемент управления ListBoxItem на более похожий;

<Grid x:Name="LayoutRoot">
    <CheckBox IsChecked="{Binding IsChecked}" Height="72" HorizontalAlignment="Left" Margin="0,7,0,0" Name="checkBox" VerticalAlignment="Top" />
    <TextBlock Height="55" HorizontalAlignment="Left" Margin="74,12,0,0" Name="studentName" Text= "{Binding OppilaanNimi}" VerticalAlignment="Top" Width="394" FontSize="40" />
</Grid>

Затем в обработчике щелчков вашей кнопки;

private void Tallenna_Button_Click(object sender, RoutedEventArgs e)
{
  List<Kurssit> selected = _Kurssit.Where(x => x.IsSelected == true).ToList()
  // You can now operate manipulate this sublist as needed
  // ie. Save this subset of items to IsolatedStorage
  //     Or remove the items from the original _Kurssit collection... whatever :)
}

Примечание. Поскольку переменная-член, которую вы также привязываете в этом примере, имеет тип "> ObservableCollection {T} , вызывающая Add(), Remove() и др., Вызовет события, а ListBoxпри необходимости ответьте на эти добавления / удаления элементов управления пользовательского интерфейса для этих элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...