Я делаю проект формы Xamarin, у меня есть список задач, которые можно выполнить или завершить. Я хочу добавить кнопку для отображения «Отметить как завершенную» для завершенных задач и «Отметить как завершенную» для завершенных задач. конечно, он должен обновляться, когда пользователь щелкает один раз. У меня есть поле «CompletedDate», которое определяет, завершена ли задача, когда она имеет значение.
TextColor = "{StaticResource PrimaryBlack}" />
<CollectionView Grid.Row = "1" ItemsSource = "{Binding Tasks}" x:Name = "List3">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<Frame
Margin = "0,10"
Padding = "10"
BackgroundColor = "{StaticResource PrimaryWhite}"
BorderColor = "{StaticResource PrimaryLightGray}"
CornerRadius = "10"
HasShadow = "False">
<Grid RowDefinitions = "Auto,Auto,Auto,Auto,Auto,Auto" RowSpacing = "15">
<StackLayout Orientation = "Horizontal">
<Label
FontFamily = "{StaticResource MeduimFont}"
Style = "{StaticResource LabelMedium}"
Text = "Completed"
IsVisible = "{Binding CompletedTaskVisibility}}"
TextColor = "{Binding PrimaryPersianGreen}" />
<StackLayout HorizontalOptions = "EndAndExpand" Orientation = "Horizontal">
<Image
HeightRequest = "20"
Source = "iconCalender.png"
WidthRequest = "20" />
<Label
FontFamily = "{StaticResource MeduimFont}"
Style = "{StaticResource LabelMedium}"
Text = "{Binding CompletedDate,StringFormat='{0:MMMM dd, yyyy}'}"
TextColor = "{StaticResource PrimaryBlack}"
/>
</StackLayout>
</StackLayout>
<BoxView
Grid.Row = "1"
HeightRequest = "1"
Color = "{StaticResource PrimaryLightGray}" />
<Label
Grid.Row = "2"
Style = "{StaticResource LabelMedium}"
Text = "{Binding Name}"
TextColor = "{StaticResource PrimaryBlack}" />
<Label
Grid.Row = "3"
Style = "{StaticResource LabelMedium}"
Text = "{Binding Description}"
TextColor = "{StaticResource PrimaryBlack}" />
<Button
x:Name = "lstbtnMarkasComplite"
Grid.Row = "5"
Padding = "15,0"
Clicked = "MarkTaskAsCompletedClicked"
CornerRadius = "20"
FontSize = "{StaticResource Font12}"
HeightRequest = "40"
CommandParameter = "{Binding Id}"
HorizontalOptions = "CenterAndExpand"
Style = "{StaticResource ButtonPurple}"
Text = "Mark as Completed" />
</Grid>
</Frame>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
У меня есть поле «CompletedDate», которое определяет, завершена ли задача, когда она имеет значение.





Есть два решения:
Я предлагаю вам попробовать второе решение, потому что первое нужно сделать много и преобразовать событие clicked в команду. И второй уменьшает много работы.
Наконец, вы можете попробовать использовать другие элементы управления вместо кнопки. Такие как:
Флажок:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/checkbox
Переключатель:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/пользовательский интерфейс/переключатель
Редактировать:
в модели представления:
public ViewModel()
{
CompletedDate = ""; //set the value with the model data
if (CompletedDate != null)
{
isCompleted = true;
}
else isCompleted = false;
}
public event PropertyChangedEventHandler PropertyChanged;
bool isCompleted;
public bool IsCompleted {
get { return isCompleted; }
set {
isCompleted = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsCompleted"));
}
}
}
в xaml:
<Button
x:Name = "lstbtnMarkasComplite"
Grid.Row = "5"
Padding = "15,0"
Clicked = "MarkTaskAsCompletedClicked"
CornerRadius = "20"
FontSize = "{StaticResource Font12}"
HeightRequest = "40"
CommandParameter = "{Binding Id}"
HorizontalOptions = "CenterAndExpand"
Style = "{StaticResource ButtonPurple}"
Text = "Mark as Completed"
IsVisible = "{Binding IsCompleted}"/>
<Button
x:Name = "lstbtnMarkasComplite"
Grid.Row = "5"
Padding = "15,0"
Clicked = "MarkTaskAsInCompletedClicked"
CornerRadius = "20"
FontSize = "{StaticResource Font12}"
HeightRequest = "40"
CommandParameter = "{Binding Id}"
HorizontalOptions = "CenterAndExpand"
Style = "{StaticResource ButtonPurple}"
Text = "Mark as in Completed"
IsVisible = "{Binding IsCompleted}/>
Вы также можете использовать DataTrigger, как сказал Ibrennan208, а затем проверить значение Text в page.cs:
private async void Button_Clicked(object sender, EventArgs e)
{
Button button = sender as Button;
if (button.Text == "Mark as Completed")
{
.........
}
else
{
.........
}
}
Обновлять:
<Button.Triggers>
<DataTrigger TargetType = "Button" Binding = "{Binding CompletedDate}" Value = "{x:Null}">
<Setter Property = "Text" Value = "Mark Task as Completed"/>
</DataTrigger>
</Button.Triggers>
Вы можете проверить отредактированный ответ. @Mah
Вы можете установить значение IsCompleted в методе Construction модели представления. Пожалуйста, проверьте код в модели представления в ответе. @Ма
так завершен только один? Правильно? У меня есть список задач, как я могу привязать его к дате выполнения нескольких задач?
Это не только один. Это похоже на CompletedDate в модели представления, разные элементы имеют разное значение iscompleted. Таким образом, кнопка в элементе зависит от значения iscompleted, которое зависит от значения CompletedDate, указанного в каждом элементе. @Ма
в моей модели просмотра у меня есть эта строка: public ObservableCollection<ProjectTaskLineItemSummary> Tasks {get; набор; } Я объяснил больше здесь: stackoverflow.com/questions/72201437/…
Извините, это моя невнимательность, для этого условия вам может понадобиться добавить переменную bool IsCompleted в модель ProjectTaskLineItemSummary. Потому что кнопка находится в элементе представления коллекции, а элемент должен привязывать свойство в модели. И затем вы можете установить значение IsCompleted для ProjectTaskLineItemSummary в методе построения модели представления или просто установить его при установке значения модели. @Ма
Или вы можете попытаться напрямую привязать его к CompletedDate, пожалуйста, проверьте обновление в моем ответе. @Mah
Я думаю, что это будет отличное решение, вы можете попробовать, и я рад получить ваш ответ. @Ма
Вы можете попробовать добавить DataTrigger в свой Button. Их можно использовать для применения условных привязок или значений к таким свойствам, как свойство Button.Text.
Для кнопки вы можете реализовать ее аналогично следующему:
<Button Test = "Mark Complete">
<Button.Triggers>
<DataTrigger TargetType = "Button" Binding = "{Binding IsCompleted}" Value = "True">
<Setter Property = "Text" Value = "Mark Incomplete"/>
</DataTrigger>
</Button.Triggers>
</Button>
Затем вы также можете добавить поле IsCompleted в свою модель представления:
public bool IsCompleted
get { return CompletedDate.HasValue; }
который будет действовать как переключатель для вашей кнопки.
Вам также необходимо добавить уведомление для переменной IsCompleted.
Вызов OnPropertyChanged(nameof(IsCompleted)) при установке CompletedDate сделает это.
Спасибо за ответ, но как я могу привязать isCompleted к свойству элемента collectionview?
Спасибо за ответ, но как я могу привязать логическое значение к элементам представления коллекции? Можете ли вы привести пример?