Как установить флажок в списке, установленный по умолчанию

#c# #windows-phone-8 #checkbox

#c# #windows-phone-8 #флажок

Вопрос:

Я пишу приложение для Windows Phone 8. У меня есть список, связанный с классом, и он содержит XML-данные. В моем классе есть одно поле с именем Favorite , и я хочу, чтобы, если Favorite оно равно 0, флажок должен быть снят, а если оно равно 1, флажок должен быть установлен. Для получения дополнительной информации см. Мой код ниже:

 <ListBox x:Name="listBox1" Width="429" Height="621" HorizontalAlignment="Left" 
         Margin="21,43,0,59" VerticalAlignment="Top" ItemsSource="{Binding}" 
         SelectedItem="{Binding}" SelectionMode="Extended">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Width="440">
                <TextBlock Text="{Binding}" TextWrapping="Wrap" Foreground="Black" FontSize="22" Height="30" TextAlignment="Left" Width="Auto" FontWeight="SemiBold"/>
                <TextBlock Text="{Binding}" TextWrapping="Wrap" Foreground="Black" FontSize="22" Margin="5" Height="30" TextAlignment="Left" Width="Auto" FontWeight="SemiBold"/>
                <TextBlock Text="{Binding}" TextWrapping="Wrap" Foreground="Black" FontSize="22" Margin="5" Height="30" TextAlignment="Left" Width="Auto" FontWeight="SemiBold"/>
                <StackPanel>
                    <CheckBox x:Name="CheckBox1" IsChecked="False" Height="72" Foreground="Black" Margin="358,-110,22,0" BorderBrush="Black" Loaded="CheckBox1_Loaded" Checked="CheckBox1_Checked" Unchecked="CheckBox1_Unchecked" />
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
  

Вот мой файл с кодом:

 XDocument doc = XDocument.Parse(e.Result);
List<CUST_CONT> customers = new List<CUST_CONT>();

customers = (from query in doc.Descendants("row")
             select new CUST_CONT
             {
                 Id = query.Element("Id").Value,
                 Name = query.Element("Name").Value,
                 Address = query.Element("Address").Value,
                 Favourite = (query.Element("Favourite").Value)
             }).ToList();
listBox1.DataContext = customers;
  

Ответ №1:

Вам необходимо привязать флажок к данным на основе требуемого условия. Здесь попробуйте реализовать это;

 <ListBox x:Name="listBox1" Width="429" Height="621" HorizontalAlignment="Left" Margin="21,43,0,59" VerticalAlignment="Top" ItemsSource="{Binding}" SelectedItem="{Binding}" SelectionMode="Extended">
   <ListBox.ItemTemplate>
     <DataTemplate>
       <StackPanel Orientation="Vertical" Width="440">
            <TextBlock Text="{Binding}" TextWrapping="Wrap" Foreground="Black" FontSize="22" Height="30" TextAlignment="Left" Width="Auto" FontWeight="SemiBold"/>
            <TextBlock Text="{Binding}" TextWrapping="Wrap" Foreground="Black" FontSize="22" Margin="5" Height="30" TextAlignment="Left" Width="Auto" FontWeight="SemiBold"/>
            <TextBlock Text="{Binding}" TextWrapping="Wrap" Foreground="Black" FontSize="22" Margin="5" Height="30" TextAlignment="Left" Width="Auto" FontWeight="SemiBold"/>

            <StackPanel>
               <CheckBox x:Name="CheckBox1" IsChecked="{Binding IsFavourite}" Height="72" Foreground="Black" Margin="358,-110,22,0" BorderBrush="Black" Loaded="CheckBox1_Loaded" Checked="CheckBox1_Checked" Unchecked="CheckBox1_Unchecked" />
            </StackPanel>
       </StackPanel>
      </DataTemplate>
   </ListBox.ItemTemplate>    
</ListBox>
  

Затем в вашем коде;

 XDocument doc = XDocument.Parse(e.Result);
List<CUST_CONT> customers = new List<CUST_CONT>();

customers = (from query in doc.Descendants("row")
            select new CUST_CONT
            {
                 Id = query.Element("Id").Value,
                 Name = query.Element("Name").Value,
                 Address = query.Element("Address").Value,
                 Favourite = (query.Element("Favourite").Value)
            }).ToList();

for (int i = 0; i < customers.Count; i  )
{
    if (customers.ElementAt(i).Favourite == "0")
    {
        customers.ElementAt(i).IsFavourite = "False";
    }
    else
    {
        customers.ElementAt(i).IsFavourite = "True";
    }
}

listBox1.DataContext = customers;
  

Не забудьте добавить IsFavourite в CUST_CONT класс

 public class CUST_CONT
{
    public string IsFavourite { get; set; }
}
  

Надеюсь, это поможет.

Комментарии:

1. рад помочь @NiteshKothari.

2. Vyas_27, можете ли вы сказать мне, как предотвратить chechBox. Проверенное событие? Проблема в том, что когда я перехожу на страницу, по умолчанию установлен флажок. Срабатывает событие Checked. Как это решить?

3. @NiteshKothari попробуйте добавить свой обработчик событий после привязки списка. т.е. Удалите Checked=»CheckBox1_Checked», Unchecked=»CheckBox1_Unchecked» из вашего XAML и добавьте этот CheckBox1.Checked = ваш обработчик событий и CheckBox1.Unchecked = Другой обработчик событий. КОД после listBox1.DataContext = клиенты. Посмотрите, поможет ли это.

4. Vyas_27, но мой флажок находится внутри списка, поэтому я не могу получить к нему доступ, например, «CheckBox1.Checked». как мне получить к нему доступ?? Большое вам спасибо!!

5. В начале вашей страницы добавьте; private bool isBinding { get; set; } затем isBinding = true; listBox1.DataContext = customers; isBinding = false; И код в ваших проверенных и непроверенных обработчиках событий добавит его между if (!isBinding){ «ДОБАВЬТЕ СВОЙ КОД СЮДА» }. Когда вы привязываете свой список, событие checked и unchecked будет срабатывать на основе привязки, но код не будет выполняться, потому что isBinding имеет значение true. Посмотрите, поможет ли это.

Ответ №2:

вы должны использовать IValueConverter

Нравится

  public class YesNoToBooleanConverter : IValueConverter
    {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                    if(value.ToString()=="0")
                      {
                         return false;
                      }
                    else
                     {
                        return true;
                     }
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {

            }
    }
  

в вашем XAML

 <Window.Resources>
            <local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
</Window.Resources>



<CheckBox IsChecked="{Binding Favourite,Mode="TwoWay", Converter={StaticResource YesNoToBooleanConverter}}"/>
  

Комментарии:

1. Дхавал Птел, спасибо за быстрый ответ, я получаю ошибку в методе обратного преобразования, а также в «<local:YesNoToBooleanConverter x:Key=»YesNoToBooleanConverter» />»