>백엔드 개발 >C++ >USERCONTROL에서 종속성 프로퍼티를 사용할 때 왜 부모님 뷰 모델의`SelectedFile '속성 업데이트가 아닌가?

USERCONTROL에서 종속성 프로퍼티를 사용할 때 왜 부모님 뷰 모델의`SelectedFile '속성 업데이트가 아닌가?

DDD
DDD원래의
2025-02-01 17:16:09562검색

의존성 프로페티 바인딩 문제 및 솔루션 Why Doesn't My Parent ViewModel's `SelectedFile` Property Update When Using a DependencyProperty in a UserControl?

이 예제는 선택한 파일의 경로를 텍스트 상자에 표시하고 파일을 탐색 할 수있는 파일 브라우저 컨트롤을 보여줍니다.

컨트롤 사용은 다음과 같습니다

>> 질문 :

"브라우즈"버튼을 클릭하면 파일 브라우저 컨트롤의 텍스트 상자가 올바르게 업데이트되지만 부모 제어 뷰 모드의 선택된 파일 속성이 설정되지 않습니다.

근본 원인 :
<code class="language-xml"><UserControl ... x:Class="Test.UserControls.FileBrowserControl">
    <Grid ...>
        <TextBox Text="{Binding SelectedFile}" />
    </Grid>
</UserControl></code>
문제는 FileBrowserControl 자체의 생성자에 데이터 콘텍스트가 자체로 설정된다는 것입니다.
<code class="language-csharp">public class FileBrowserControl : UserControl
{
    public ICommand BrowseCommand { get; set; }
    public static DependencyProperty SelectedFileProperty = DependencyProperty.Register("SelectedFile", ...);
    public string SelectedFile { get => (string)GetValue(SelectedFileProperty); set => SetValue(SelectedFileProperty, value); }
    public string Filter { get; set; }

    public FileBrowserControl()
    {
        ...
        this.DataContext = this; // 将 DataContext 设置为 FileBrowserControl 实例。
    }

    private void Browse()
    {
        ...
        SelectedFile = dialog.FileName; // 更新 FileBrowserControl 实例的 SelectedFile 属性。
    }
}</code>
이는 뷰 모델에 바인딩 된 상속과 충돌합니다. 이는 친척 소스를 사용한 데이터 바인딩 속성을 파괴하기 때문입니다.

솔루션 :

이 문제를 해결하려면 usercontrol의 XAML의 바인딩을 수정해야합니다.
<code class="language-xml"><FileBrowserControl Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*" SelectedFile="{Binding SelectedFile}" /></code>
이것은 선택된 파일 속성이 부모 제어 부품의 선택된 파일 속성에 바인딩되도록 할 수 있으며, 이는 아버지 통제의 데이터 컨텍스트를 상속합니다. 를 지정함으로써, 바인딩은 usercontrol의 상위 수준을 찾아 올바른 속성을 ​​찾을 수 있습니다.

위의 수정을 통해, 상위 뷰 모델의 속성이 올바르게 업데이트됩니다.

위 내용은 USERCONTROL에서 종속성 프로퍼티를 사용할 때 왜 부모님 뷰 모델의`SelectedFile '속성 업데이트가 아닌가?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.