這是串列視圖
<ListView x:Name="task_list" SelectionChanged="task_list_SelectionChanged" Grid.Row="0" Grid.Column="1" Background="Transparent">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:TaskTodo">
<TextBlock Width="100" Foreground="White" Text="{x:Bind NameTask}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
和視圖模型
public class TaskTodo : INotifyPropertyChanged
{
private string _NameTask, _Reminder, _Date, _Priority, _NameList, _Description;
private int _Id, _ParentTask;
private DateTimeOffset _NextRep;
public TaskTodo()
{
_NameTask = String.Empty;
_Reminder = String.Empty;
_Date = String.Empty;
_Priority = String.Empty;
_NameList = String.Empty;
_Description = String.Empty;
_ParentTask = -1;
_Id = 1;
}
Resource_Manager rm = new Resource_Manager();
public event PropertyChangedEventHandler PropertyChanged;
TaskSqliteDataAccess TaskSqlite = new TaskSqliteDataAccess();
private void NotifyPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public int TaskId { get { return _Id; } set { _Id = value; NotifyPropertyChanged(TaskId.ToString()); } }
public string NameTask { get { return _NameTask; } set { _NameTask = value; NotifyPropertyChanged(NameTask); } }
public string Reminder { get { return _Reminder; } set { _Reminder = value; NotifyPropertyChanged(FormatDateReminder); } }
public string NameList {
get
{
if ( _NameList == string.Empty || _NameList == null)
{
return rm.GetDefaultNamelist;
}
return _NameList;
}
set { _NameList = value; NotifyPropertyChanged(NameList); }
}
public string Date { get { return _Date ; } set { _Date = value; NotifyPropertyChanged(FormatDate); } }
public string FormatDate
{
get
{
var cultureInfo = new CultureInfo("en-US");
DateTimeOffset DueDate;
if (Date != string.Empty && Date != null)
{
DueDate = DateTimeOffset.Parse(Date, cultureInfo);
return String.Format(" {0},{1} {2}", DueDate.DayOfWeek, DueDate.Day, DueDate.ToString("MMM"));
}
else
return rm.GetDefaultDate;
}
}
public string Priority { get { return _Priority; } set { _Priority = value; NotifyPropertyChanged(Priority); } }
public string Description { get { return _Description; } set { _Description = value; NotifyPropertyChanged(Description); } }
public DateTimeOffset NextRep { get { return _NextRep; } set { _NextRep= value; NotifyPropertyChanged(NextRep.ToString()); } }
public int ParentTask { get { return _ParentTask; } set { _ParentTask = value; NotifyPropertyChanged(TaskId.ToString()); } }
public string FormatTimeReminder
{
get {
DateTime Time;
var cultureInfo = new CultureInfo("en-US");
if ( Reminder != string.Empty && Reminder != null )
{
Time = DateTime.Parse (Reminder, cultureInfo);
return string.Format(" Remind me at {0}:{1}", Time.Hour, Time.Minute);
}
return rm.GetDefaultReminder;
}
}
public string FormatDateReminder
{
get
{
DateTimeOffset Date;
if(DateTimeOffset.TryParse(_Reminder, out Date) == true)
{
return string.Format(" {0},{1} {2}", Date.DayOfWeek, Date.Day, Date.ToString("MMM"));
}
return Reminder;
}
}
public ObservableCollection<TaskTodo> GetTasks() => TaskSqlite.GetTaskDB();
public void AddTask(TaskTodo task) => TaskSqlite.AddTaskDB(task);
public void UpdateTask() => TaskSqlite.UpdateData(TaskId, NameTask, Date, Reminder, Priority, NameList, Description, NextRep);
public ObservableCollection<TaskTodo> GetSubtasks(TaskTodo taskTodo) => TaskSqlite.GetSubtasks(taskTodo);
例如,如果我更改表單中的 NameTask 屬性,則屬性更改,并且如果將該屬性系結到表單中的 texblock,則 texblock 具有新值,但 listview 的 texblock 沒有

StackPanel Name="TaskForm" Grid.Column="2" Width="340" Background="#04000E" HorizontalAlignment="Right" Visibility="Collapsed" >
<Button FontSize="20" Name="quit_TaskForm" Content="x" Click="quit_TaskForm_Click" HorizontalAlignment="Right" Background="Transparent"></Button>
<TextBox Name="NameTaskForm" HorizontalAlignment="Center" FontSize="20"
TextChanged="NameTaskForm_TextChanged" LostFocus="NameTaskForm_LostFocus" Foreground="White"
DataContext="{Binding ElementName=task_list, Path=SelectedItem}"
Text="{Binding Path=NameTask, Mode=TwoWay}"
Style="{StaticResource TextBoxStyle1}" BorderThickness="0" />
</StackPanel>
這是表單中文本框的文本更改時的事件代碼
private void NameTaskForm_TextChanged(object sender, TextChangedEventArgs e)
{
if ((task_list.SelectedItem as TaskTodo)!= null)
{
(task_list.SelectedItem as TaskTodo).NameTask = NameTaskForm.Text;
(task_list.SelectedItem as TaskTodo).UpdateTask();
}
}
uj5u.com熱心網友回復:
NotifyPropertyChanged方法采用屬性的名稱,而不是它的值...
NotifyPropertyChanged(NameTask);
這應該更改為
NotifyPropertyChanged(nameof(NameTask));
就像在這一行
public string NameTask { get { return _NameTask; } set { _NameTask = value; NotifyPropertyChanged(NameTask); } }
應該是這樣的
public string NameTask { get { return _NameTask; } set { _NameTask = value; NotifyPropertyChanged(nameof(NameTask)); } }
因此,您必須在每次呼叫時編輯所有代碼,NotifyPropertyChanged以便為它提供您更改的屬性的名稱......或者您可以讓編譯器自動獲取呼叫者屬性名稱,只需使用CallerMemberName屬性
using System.Runtime.CompilerServices;
//...
void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
并在不傳遞任何值的情況下呼叫它,編譯器會自動獲取呼叫者名稱
如下
public string NameTask
{
get { return _NameTask; }
set
{
_NameTask = value;
NotifyPropertyChanged(); // without passing any value
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/436542.html
