MAUI中如何访问CollectionView分组头内的指定控件?
你没法直接通过x:Name访问DataTemplate里的控件,因为每个分组头都会被模板实例化出独立的控件实例,后台代码根本识别不到这些名字。正确的做法是用数据绑定,把按钮的启用状态和分组数据绑定起来,具体步骤如下:
1. 给WordsGroup类添加音频状态属性
给你的WordsGroup新增两个布尔属性,用来标记当前分组是否有英式/美式音频:
public class WordsGroup { // 保留你原有的Name、Items、Ipauk等属性 public bool HasUkSound { get; set; } public bool HasUsSound { get; set; } // 更新构造函数,初始化默认状态 public WordsGroup(string name, List<Words> items, string ipauk, List<Words> wordsList) { Name = name; Items = items; Ipauk = ipauk; // 默认设为true,后续根据实际音频数据修改 HasUkSound = true; HasUsSound = true; } }
2. 修正后台代码的音频判断逻辑
原来的代码里,sounds.Where(...)返回的是集合,不能直接用==null判断,改用FirstOrDefault()获取单条数据,然后给每个WordsGroup设置对应的音频状态:
List<Words> list = new List<Words>(); var dict = words.GroupBy(o => o.Word).ToDictionary(g => g.Key, g => g.ToList()); List<string> _words_list = dict.Keys.ToList(); sounds = await _iWord_SoundsRepository.GetGroupWords_Sound(_words_list); WordsGroups = new List<WordsGroup>(); foreach (KeyValuePair<string, List<Words>> item in dict) { var group = new WordsGroup(item.Key, new List<Words>(item.Value), " /" + item.Value[0].IPAUK + "/ " + " /" + item.Value[0].IPAUS + "/", new List<Words>(item.Value)); // 检查英式音频是否存在(非空且有效) var soundEntry = sounds.FirstOrDefault(q => q.Word == item.Key); group.HasUkSound = soundEntry != null && !string.IsNullOrWhiteSpace(soundEntry.Sound1); // 检查美式音频是否存在(非空且有效) group.HasUsSound = soundEntry != null && !string.IsNullOrWhiteSpace(soundEntry.Sound2); WordsGroups.Add(group); } lvWords.ItemsSource = WordsGroups; lblStatus.Text = "Found Words:" + dict.Count.ToString();
3. 修改XAML,绑定按钮的IsEnabled属性
在GroupHeaderTemplate里,把两个ImageButton的IsEnabled绑定到WordsGroup的新属性:
<ImageButton x:Name="imgbUk1" ZIndex="4" Margin="5,0,0,0" BackgroundColor="Transparent" CornerRadius="0" Source="uk_sound.png" HeightRequest="48" WidthRequest="48" Clicked="imgbUk_Clicked" IsEnabled="{Binding HasUkSound}"/> <ImageButton x:Name="imgbUs1" ZIndex="5" Margin="5,0,0,0" BackgroundColor="Transparent" CornerRadius="0" Source="us_sound.png" HeightRequest="48" WidthRequest="48" Clicked="imgbUs1_Clicked" IsEnabled="{Binding HasUsSound}"/>
这样每个分组头的按钮会自动根据对应分组的音频状态启用或禁用,完全不需要后台直接操作控件实例。
内容的提问来源于stack exchange,提问作者Francisco Lopez
相关产品推荐
相关产品推荐

