Я пытался получить доступ к переменной из моего кода XAML через привязку. Я не знаю почему, но я могу получить доступ к переменной, но не получаю никакого значения.
Как видите, IntelliSense может получить доступ к переменной:
Но код XAML не получает никакого значения. Когда я помещаю переменную вне , все работает нормально. Вот пример кода:
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions = "*,*">
<VerticalStackLayout Grid.Column = "{Binding TempColNum}">
<Image Source = "{Binding MainImage}" Aspect = "AspectFit" HeightRequest = "120" x:DataType = "model:ImagesJson"/>
<Label Text = "{Binding Topic}" x:DataType = "model:ImagesJson"/>
<Label Text = "{Binding Likes}" x:DataType = "model:ImagesJson"/>
</VerticalStackLayout>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
Редактировать:
Вот код позади:
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using neview.Model.Profile;
using System.Collections.ObjectModel;
namespace neview.ViewModel.Profile
{
public partial class ProfileViewModel : ObservableObject
{
public ProfileViewModel(ImagesLoad postLoad)
{
tempColNum = 1;
this.imagesLoad = postLoad;
isRefreshing = false;
}
//------------------------------------------------------------------------
// COMMANDS
// get images
[RelayCommand]
public async Task GetImagesAsync()
{
var localMainPost = await imagesLoad.GetImages();
if (imagesCollection.Count() != 0)
{
imagesCollection.Clear();
}
foreach (var i in localMainPost)
{
imagesCollection.Add(i);
}
IsRefreshing = false;
}
//------------------------------------------------------------------------
// VARIABLES
public ObservableCollection<ImagesJson> imagesCollection { get; } = new();
ImagesLoad imagesLoad;
[ObservableProperty]
bool isRefreshing;
[ObservableProperty]
int tempColNum;
}
}
TempColNum имеет тип int32. Я попытался привязать TempColNum к тексту метки, и он ничего не показывает.
то у вас скорее всего проблема с данными. Вы выполнили код в отладчике, чтобы убедиться, что для этого свойства задано значение?
это свойство на модели ImagesJson
?
Неа. Я добавил код в редактирование.
вам нужно использовать относительную привязку, если вы хотите привязаться к свойству, которое не является частью текущего контекста привязки
Я пытался, но не смог (вероятно, не знаю как). Можете ли вы показать мне синтаксис, пожалуйста?
Вы должны показать окружающий XAML, а не только часть с DataTemplate
, тогда будет легче увидеть и объяснить, как это исправить. Как уже писал @Jason, вам понадобится относительная привязка.
пожалуйста, покажите нам, что вы пробовали, если вам нужна дополнительная помощь. Есть много-много существующих вопросов об относительных привязках как для MAUI, так и для XF.
Вам нужно будет использовать RelativeSource
, потому что контекст привязки изменяется на тип объектов, находящихся внутри коллекции, при использовании DataTemplate
, здесь это будет ImagesJson
, в то время как вы хотите выполнить привязку к ProfileViewModel
.
Обновите свой XAML следующим образом:
<CollectionView.ItemTemplate>
<DataTemplate x:DataType = "model:ImagesJson">
<Grid ColumnDefinitions = "*,*">
<VerticalStackLayout Grid.Column = "{Binding TempColNum, Source = {RelativeSource AncestorType = {x:Type viewmodel:ProfileViewModel}}}">
<Image Source = "{Binding MainImage}" Aspect = "AspectFit" HeightRequest = "120"/>
<Label Text = "{Binding Topic}"/>
<Label Text = "{Binding Likes}"/>
</VerticalStackLayout>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
Отказ от ответственности: я не уверен, что привязка Grid.Column
к свойству действительно будет работать, потому что Grid.Column
является присоединенным свойством.
откуда ты знаешь, что он не работает? Попробуйте привязать
TempColNum
кLabel
, чтобы убедиться, что значение установлено и привязывается правильно. А что за типTempColNum
?