로드 시 WPF MVVM 포커스 필드
단일 보기가 있습니다.TextBox
그리고 몇 명Button
그 아래 s.창문이 열리면 나는 그것을 원합니다.TextBox
집중력이 있습니다.
MVVM을 사용하지 않으면 전화를 걸 것입니다.TextBox.Focus()
Loaded(로드됨) 이벤트에서.그러나 내 View Model은 내 뷰에 대해 알지 못하는데 어떻게 내 뷰 뒤에 있는 코드에 코드를 넣지 않고 이를 수행할 수 있습니까?
편집: 답변을 읽은 후 이 코드를 보기 xaml에 넣기로 결정했습니다.
<DockPanel FocusManager.FocusedElement="{Binding ElementName=MessageTextBox}">
<TextBox Name="MessageTextBox" Text="{Binding Message}"/>
</DockPanel>
만약 이것이 초기 페이지 초점 이외의 것이었다면, 나는 아마도 존 갤러웨이의 대답을 추천할 것입니다. 왜냐하면 그것은 View Model에서 제어할 수 있기 때문입니다.
기분이 좋아지면(기분이 좋아지면) 첨부된 속성을 사용하여 Xaml에서 이 작업을 수행할 수 있습니다.
http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.focusedelement.aspx
당신이 뒤에서 코드로 할 수 있는 모든 것은 당신이 트릭을 안다면 Xaml에서 할 수 있습니다.다행히도, 당신은 이 속임수를 실행할 필요가 없었습니다. MS가 당신을 위해 그렇게 했습니다.
이 경우 코드를 뷰에 넣으면 된다고 생각합니다.포커스를 컨트롤로 설정하면 응용 프로그램의 논리보다는 사용자 인터페이스의 동작에 영향을 미치므로 뷰의 책임이 됩니다.
사실 포커스는 UI에 관한 문제가 아닌가요?MVVM은 우려 사항을 분리하는 것에 관한 것입니다. 모델에 속하는 것은 모델에 있고 뷰에 속하는 것은 뷰에 있으며 바인딩 모델과 뷰가 함께 있는 것은 View 모델에 있습니다(물론 너무 단순화된 설명입니다).
즉, UI 로직이 보기 - 텍스트 상자에 유지됩니다.포커스()는 이를 실현하는 데 적합한 방법이라고 생각합니다.
- View Model에 현재 초점을 맞추고 있는 요소를 나타내는 속성이 있어야 합니다.
포커스 관리자를 사용하여 해당 속성에 바인딩합니다.
<Window FocusManager.FocusedElement="{Binding ElementName=ViewModel.FocusedItem}"/>
View 모델은 View에 정보를 제공하기 위해 존재하는 변환기이므로 View가 작동하는 데 필요한 모든 정보를 VM에 추가할 수 있습니다.
포커스가 있는 컨트롤은 매우 "시각적으로만" 있으므로 코드 뒤에 있는 컨트롤에는 문제가 없습니다.
VM의 개념은 논리를 View에서 분리하고, 뷰를 바인딩할 모델의 데이터 바인딩 친화적인 버전을 제공하는 것입니다.이는 모든 코드가 반드시 VM에 상주해야 한다는 것을 의미하는 것은 아니며, 논리 코드와 UI에 직접 연결되지 않은 모든 코드가 VM에 상주해야 합니다.
'WPF 초기 집중 악몽'을 꾸고 스택에 대한 몇 가지 답변을 토대로 다음과 같은 내용이 제게 최고의 솔루션임을 증명했습니다.
먼저 App.xaml OnStartup()을 추가합니다.
EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent,
new RoutedEventHandler(WindowLoaded));
그런 다음 App.xaml에서도 'Windows Loaded' 이벤트를 추가합니다.
void WindowLoaded(object sender, RoutedEventArgs e)
{
var window = e.Source as Window;
System.Threading.Thread.Sleep(100);
window.Dispatcher.Invoke(
new Action(() =>
{
window.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
}));
}
WPF 초기 포커스가 일부 프레임워크 경합 조건으로 인해 대부분 실패하므로 스레드 문제를 사용해야 합니다.
저는 다음 솔루션이 전체 앱에 전 세계적으로 사용되기 때문에 가장 적합하다고 생각했습니다.
도움이 되길...
오란
언급URL : https://stackoverflow.com/questions/1178449/wpf-mvvm-focus-field-on-load
'programing' 카테고리의 다른 글
장고 모델에서 열거형을 선택 필드로 사용하려면 어떻게 해야 합니까? (0) | 2023.05.06 |
---|---|
프로세스 ID X 코드에 연결하지 못했습니다. (0) | 2023.05.06 |
소스 제어의 .vs\config\applicationhost.config (0) | 2023.05.06 |
터미널을 사용하여 Mac OS X에서 C 프로그램을 실행하려면 어떻게 해야 합니까? (0) | 2023.05.06 |
Docker 이미지 내부의 사용자를 루트가 아닌 사용자로 전환 (0) | 2023.05.06 |