INotify를 구현하지 않고 바인딩이 업데이트되는 이유는 무엇입니까?속성이 변경되었습니까?
ViewModel을 생성하여 UI의 두 텍스트 상자에 속성을 바인딩했습니다.먼저 값을 변경하고 텍스트 상자에서 포커스를 떼면 다른 텍스트 상자의 값이 변경되지만 Inotify를 구현하지 않습니다.속성이 변경되었습니다.이게 어떻게 작동하나요?
XAML을 다음에 나타냅니다.
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
<StackPanel>
<TextBox Text="{Binding Name}" />
<TextBox Text="{Binding Name}" />
</StackPanel>
</Window>
다음은 내 View Model입니다.
class ViewModel
{
public string Name { get; set; }
}
내가 시험해 봤어, 네 말이 맞아.그래서 인터넷에서 검색해봤는데 이게 있더라고요.
회신이 오래 걸려서 죄송합니다.사실 WPF의 숨겨진 다른 측면이 있습니다.즉, 소스 개체가 플레인 CLR 개체이고 INotify를 구현하지 않으면 WPF의 데이터 바인딩 엔진이 소스 속성을 랩하는 PropertyDescriptor 인스턴스에 데이터를 바인드합니다.Property Changed 인터페이스데이터 바인딩 엔진은 PropertyDescriptor를 통해 속성 변경 이벤트에 가입하려고 합니다.Add Value Changed() 메서드.또한 타겟 데이터 바인딩 요소가 속성 값을 변경하면 데이터 바인딩 엔진은 PropertyDescriptor를 호출합니다.SetValue() 메서드는 변경된 값을 소스속성에 전송하고 ValueChanged 이벤트를 동시에 실행하여 다른 서브스크라이버에게 알립니다(이 경우 다른 서브스크라이버는 ListBox 내의 TextBlocks가 됩니다).
또한 Inotify를 구현하는 경우PropertyChanged는 UI에 데이터를 바인드해야 하는 모든 속성의 설정자에 변경 알림을 구현할 책임이 있습니다.그렇지 않으면 변경 내용이 예상대로 동기화되지 않습니다.
이걸로 일이 좀 해결됐으면 좋겠어요.
즉, 플레인 CLR 오브젝트만 있으면 이 작업을 수행할 수 있습니다.꽤 깔끔하지만 전혀 예상 밖이다 - 그리고 나는 지난 몇 년 동안 WPF 일을 조금 했다.새로운 것을 배우는 것을 멈추지 않죠?
Hasan Khan이 제안했듯이, 여기 이 주제에 대한 꽤 흥미로운 기사로 연결되는 또 다른 링크가 있다.
이 기능은 바인딩을 사용할 때만 작동합니다.코드에서 값을 업데이트하면 변경 내용이 통지되지 않습니다. [...]
WPF는 바인딩 시 훨씬 가벼운 PropertyInfo 클래스를 사용합니다.INotify를 명시적으로 실장하는 경우Property Changed, WPF가 해야 할 일은 PropertyInfo를 호출하는 것뿐입니다.GetValue 메서드를 사용하여 최신 값을 가져옵니다.모든 기술자를 얻는 것보다 작업량이 훨씬 적습니다.디스크립터는 속성 정보 클래스의 메모리 4배 정도의 비용이 듭니다.[...]
Inotify 구현Property Changed는 상당히 지루한 개발 작업이 될 수 있습니다.다만, WPF 애플리케이션의 런타임 풋 프린트(메모리 및 CPU)에 대해서, 그 작업을 저울질할 필요가 있습니다.INPC를 직접 구현하면 런타임 CPU와 메모리가 절약됩니다.
편집:
이것을 갱신하는 것은, 지금도 가끔 코멘트와 업베이트를 받고 있기 때문에, 나 자신도 WPF와 꽤 오랫동안 일하지 않고 있는 것이 분명합니다.다만, 코멘트에서도 언급되고 있듯이, 메모리 누수의 원인이 되는 것에 주의해 주세요.또한 이미 언급된 Reflection 사용법에도 상당한 영향을 미칠 것으로 예상됩니다.
WinForms에서도 동작하는 것을 방금 알았습니다.
public class Test
{
public bool IsEnabled { get; set; }
}
var test = new Test();
var btn = new Button { Enabled = false, Text = "Button" };
var binding = new Binding("Enabled", test, "IsEnabled");
btn.DataBindings.Add(binding);
var frm = new Form();
frm.Controls.Add(btn);
test.IsEnabled = true;
Application.Run(frm);
이상하게도 이 버튼은 비활성화되지 않습니다.
btn.Enabled = false;
이것은 다음과 같습니다.
test.IsEnabled = false;
때 할 수 있습니다. all 커 、 가 、 i 、 i 、 i 、 i 、 i 、 i i i i 。Binding
에는 소스 속성이 갱신되는 시기를 나타내는 속성이 있습니다.이 디폴트 값은 각각에 정의되어 있습니다.DependencyProperty
의 ,TextBox.Text
이 성성 property property to로 되어 있다.LostFocus
컨트롤이 포커스를 잃으면 속성이 업데이트됩니다.
UrbanEsc의 답변이 왜 값이 업데이트되는지 설명해준다고 생각합니다.
언급URL : https://stackoverflow.com/questions/7767218/why-does-the-binding-update-without-implementing-inotifypropertychanged
'sourcecode' 카테고리의 다른 글
Date Time의 표현(밀리초 단위) (0) | 2023.04.19 |
---|---|
코드를 통해 줄 바꿈 셀에 줄 바꿈 삽입 (0) | 2023.04.19 |
문자열을 분할하여 ToList()를 한 줄로 변환합니다. (0) | 2023.04.19 |
C#의 대소문자를 무시하고 두 문자열 비교 (0) | 2023.04.19 |
모든 git 하위 모듈에 대한 최신 변경 내용 가져오기 (0) | 2023.04.19 |