我有兩個嵌套的可觀察集合,第一個是作業日串列,第二個是這一天的可用時間。我需要有一個按鈕才能單獨洗掉這些時間中的任何一個。但是當點擊“REMOVE”標簽時,無法正確呼叫“RemoveHour”命令。到目前為止我有這個:
后面的代碼
public static ObservableCollection<Calendar> CalendarDays { get; set; } = new ObservableCollection<Calendar>();
public AgendaAutoDispon()
{
InitializeComponent();
InitializeCalendar();
CalendarDays.Add(new Calendar(DateTime.Today));
CalendarDays.Add(new Calendar(DateTime.Today.AddDays(1)));
CalendarDays.Add(new Calendar(DateTime.Today.AddDays(2)));
CollectionViewDatas.BindingContext = CalendarDays;
}
public class Calendar : INotifyPropertyChanged
{
public Picker HourPicker { get; set; } = new Picker();
public ObservableCollection<string> Hours { get; set; } = new();
public ObservableCollection<string> HoursReceipt { get; set; } = new();
public Calendar(DateTime day)
{
Day = day;
for (int i = 6; i <= 22; i )
{
HoursReceipt.Add((i < 10 ? "0" i.ToString() : i.ToString()) ":00");
HoursReceipt.Add((i < 10 ? "0" i.ToString() : i.ToString()) ":30");
}
NotifyPropertyChanged("HoursReceipt");
}
private string _DateShow;
public string DateShow
{
get => _DateShow;
set
{
_DateShow = value;
NotifyPropertyChanged("DateShow");
}
}
private DateTime _Day { get; set; }
public DateTime Day
{
get => _Day;
set
{
_Day = value;
switch (value.DayOfWeek)
{
case DayOfWeek.Sunday: WeekDay = "Sunday"; break;
case DayOfWeek.Monday: WeekDay = "Monday"; break;
case DayOfWeek.Tuesday: WeekDay = "Tuesday"; break;
case DayOfWeek.Wednesday: WeekDay = "Wednesday"; break;
case DayOfWeek.Thursday: WeekDay = "Thursday"; break;
case DayOfWeek.Friday: WeekDay = "Friday"; break;
case DayOfWeek.Saturday: WeekDay = "Saturday"; break;
}
DateShow = value.ToString("dd/MM/yyyy");
NotifyPropertyChanged("Day");
}
}
private string _WeekDay;
public string WeekDay
{
get => _WeekDay;
set
{
_WeekDay = value;
NotifyPropertyChanged("WeekDay");
}
}
public string HourChangedEvent
{
set
{
if (!Hours.Contains(value))
{
Hours.Add(value);
Hours = new ObservableCollection<string>(Hours.OrderBy(i => i));
NotifyPropertyChanged("Hours");
}
}
}
public Command RemoveHour
{
get
{
return new Command((arg) => {
Console.WriteLine("I SHOULD REMOVE =====> " (string)arg);
});
}
}
public event PropertyChangedEventHandler PropertyChanged;
void NotifyPropertyChanged(string propChanged)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propChanged));
}
}
xml
<CollectionView x:Name="CollectionViewDates" BindingContext="{Binding CalendarDays}" ItemsSource="{Binding .}"
VerticalOptions="Center" Margin="0,10,0,0">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Horizontal" HorizontalItemSpacing="10" />
</CollectionView.ItemsLayout>
<!-- WEEK DAYS -->
<CollectionView.ItemTemplate>
<DataTemplate>
<Frame CornerRadius="15" Padding="0" Margin="5" HasShadow="False" BorderColor="LightGray">
<Grid HeightRequest="300" WidthRequest="200" HorizontalOptions="CenterAndExpand">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label Text="{Binding WeekDay}" Grid.Row="0" TextColor="#4D4D4D" FontSize="20"
HorizontalTextAlignment="Center" FontAttributes="Bold" Margin="0,5,0,0" />
<Label Text="{Binding DateShow}" Grid.Row="1" Margin="0,3,0,0" TextColor="#4D4D4D" FontSize="18"
HorizontalTextAlignment="Center" />
<!-- HOURS -->
<CollectionView Grid.Row="3" ItemsSource="{Binding Hours}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical" VerticalItemSpacing="5" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid HeightRequest="30">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="30" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Text="{Binding .}" HorizontalTextAlignment="Center" />
<Label Grid.Column="1" Text="REMOVE" FontSize="20" TextColor="Red" Padding="0"
HorizontalTextAlignment="Center">
<Label.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding WHAT SHOULD I HAVE HERE??? }"
CommandParameter="{Binding .}" />
</Label.GestureRecognizers>
</Label>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
我必須做什么才能達到系結的上一個級別,其中包含命令 RemoveHour?
uj5u.com熱心網友回復:
您可以使用相對系結:
<TapGestureRecognizer
Command="{Binding RemoveHour, Source={RelativeSource AncestorType={x:Type local:Calendar}}}"
CommandParameter="{Binding .}"/>
這local:Calendar意味著您需要匯入日歷視圖模型的命名空間,xmlns:local="..."然后才能使用日歷視圖模型進行系結。
更多資訊:https ://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/relative-bindings
我還建議使用常見的 C# 和 MVVM 命名約定,例如為 ViewModel 提供ViewModel后綴,例如CalendarViewModel為RemoveHourCommand命令。
更新
我剛剛注意到您沒有正確應用 MVVM 模式。您應該將您的Calendar類移動到一個單獨的檔案并將其設定為BindingContext您的視圖的代碼隱藏。代碼隱藏不應包含作為業務邏輯一部分的狀態或物件和功能,它實際上應該只做與視圖有關的事情。我的解決方案僅在 View 的 BindingContext 設定為 時才有效Calendar,它實際上應該是一個稱為 ViewModelCalendarViewModel并包含 CalendarDays 和您嘗試系結到的命令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/518617.html
標籤:C#xamarin
