List<T>
속성에 대해 INotifypPropertyChanged
이 상승하지 않는 이유는 무엇입니까?목록 <T> 속성에 대한 알림이 작동하지 않는 이유
public class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string property = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public class TextWrapper
{
public string Text { get; set; }
public override string ToString() => Text;
}
public class ViewModel : NotifyPropertyChanged
{
public List<string> List { get; } = new List<string>();
public TextWrapper Text { get; } = new TextWrapper();
public void AddToList(string text)
{
List.Add(text);
OnPropertyChanged(nameof(List));
}
public void ChangeText(string text)
{
Text.Text = text;
OnPropertyChanged(nameof(Text));
}
}
public partial class MainWindow : Window
{
readonly ViewModel _vm = new ViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = _vm;
}
}
XAML :
이 MCVE을 고려
_vm.AddToList(...)
를 호출하면
ListBox
가 (비어있을 것입니다)를 업데이트하지 않는 동안,
_vm.ChangeText(...)
제대로
TextBlock
을 업데이트합니다 호출
<TextBlock Text="{Binding Text}" />
<ListBox ItemsSource="{Binding List}" />
. 왜?
는 참고 : 나는 약ObservableCollection<T>
을 알고 난에 대한 두 가지 가능한 해결 방법을 (
List
에 세터를 추가 한 다음 다시 제
null
을 가령 또는
DataContext
/
ItemsSource
변경하도록 설정) 알고있다. 나는 지붕 아래에있는 것이 단지
TextWrapper
보다 더 특별하다
List<T>
가 궁금하다.
사이드 노트 - 이것이 문제를 일으킬 수 있는지 확실하지 않지만'List'는 예약 된 이름입니다. 그것을 바꾸거나 "@"와 같이 접두사 "@"를 사용해보십시오. –
@KamilSolecki 어떤 클래스의 이름으로 속성을 명명하는 것은 완전히 합법적입니다. 'List'는 _generic_ 클래스이기 때문에 이름은 결코 단순히 "List"가 아니라 "List'1"등이됩니다. –