#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» />»