У меня есть представление коллекции, заполненное списком, состоящим из флажка и метки:
<CollectionView x:Name = "cvPreferences">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "30"/>
<ColumnDefinition Width = "*"/>
<ColumnDefinition Width = "20"/>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column = "0" x:Name = "{Binding}" ClassId = "{Binding}" HeightRequest = "30" IsChecked = "False" CheckedChanged = "chkPref_Checked"/>
<Label Grid.Column = "1" Text = "{Binding}" HeightRequest = "30" FontSize = "Small" Margin = "2,6,0,0" />
<ImageButton Grid.Column = "2" ClassId = "{Binding}" HeightRequest = "30" Source = "delete_pref.png" Clicked = "btnDeletePref_Clicked"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
Это заполняется глобальной переменной:
public partial class MainPage : ContentPage
{
List<String> prefsTargetFolderList = new List<String>();
...
И где-то в моем коде он заполняется так:
cvPreferences.ItemsSource = prefsTargetFolderList.OrderBy(x => x).ToList();
Я хотел бы иметь кнопку, чтобы выбрать все. Поскольку я указал x:Name и ClassId, я подумал, что смогу получить все флажки и отметить их. Однако для каждого элемента в prefsTargetFolderList флажок не установлен.
private void btnSelectAllPrefs_Clicked(object sender, EventArgs e)
{
// Check if checking it with code triggers the stuff
foreach (string pref in prefsTargetFolderList)
{
CheckBox checkbox = (CheckBox)FindByName(pref);
if (checkbox != null)
checkbox.IsChecked = true;
}
}
Любая идея по установке всех флажков, сгенерированных в представлении коллекции?
Пожалуйста, найдите для него шаблон MVVM (Ссылка 1 , Ссылка 2). Вот рабочая версия вашей проблемы. Если вы хотите иметь чистый и понятный код, ваш код должен быть похож на этот.
XAML
Код;
<ContentPage.BindingContext>
<viewModel:ViewModelMainPage/>
</ContentPage.BindingContext>
<StackLayout Spacing = " 20">
<CollectionView x:Name = "cvPreferences"
ItemsSource = "{Binding PrefsTargetFolderList}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "30"/>
<ColumnDefinition Width = "*"/>
<ColumnDefinition Width = "100"/>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column = "0" HeightRequest = "30" IsChecked = "{Binding IsCheckBoxChecked}" CheckedChanged = "CheckBox_CheckedChanged"/>
<Label Grid.Column = "1" Text = "{Binding LabelText}" HeightRequest = "30" FontSize = "Small" Margin = "2,6,0,0" />
<ImageButton Grid.Column = "2" HeightRequest = "30" Source = "dotnet_bot.png" Clicked = "ImageButton_Clicked"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
<Button Text = "Select All" Clicked = "Button_Clicked"/>
</StackLayout>
Button_Clicked
метод события;
private void Button_Clicked(object sender, EventArgs e)
{
ViewModelMainPage viewModel = BindingContext as ViewModelMainPage;
foreach (ModelCvPreferences item in viewModel.PrefsTargetFolderList)
{
item.IsCheckBoxChecked = true;
}
}
ViewModel
для просмотра;
internal class ViewModelMainPage
{
public ObservableCollection<ModelCvPreferences> PrefsTargetFolderList
{
get
{
return prefsTargetFolderList;
}
set
{
if (prefsTargetFolderList != value)
{
prefsTargetFolderList = value;
}
}
}
}
и, наконец, Model
для сохранения ваших состояний;
internal class ModelCvPreferences : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool isCheckBoxChecked = false;
public bool IsCheckBoxChecked
{
get
{
return isCheckBoxChecked;
}
set
{
if (IsCheckBoxChecked != value)
{
isCheckBoxChecked = value;
OnPropertyChanged(nameof(IsCheckBoxChecked));
}
}
}
private string labelText = "default text";
public string LabelText
{
get
{
return labelText;
}
set
{
if (labelText != value)
{
labelText = value;
OnPropertyChanged(nameof(LabelText));
}
}
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Однако для каждого элемента в prefsTargetFolderList флажок не установлен.
Прежде всего, кажется, что вы не можете использовать x:Name для доступа к элементу управления в DataTemplate
. Кроме того, x:Name
не является BindableProperty CheckBox, это атрибут, который сопоставляет свойство name или id элемента с x:Name
. Таким образом, вы не можете использовать такую привязку, как x:Name = "{Binding}"
. Вы можете обратиться к официальному документу о директиве x:Name
Вы можете попытаться создать переменную типа bool в модели, чтобы привязать ее к свойству IsChecked CheckBox. И измените свойство, чтобы установить состояние CheckBox.
Вам нужно обновить модель, к которой привязаны флажки, НЕ обновлять пользовательский интерфейс флажка напрямую.