Rumah >pembangunan bahagian belakang >C++ >Kenapa Kemas Kini Property `SelectedFile 'ibu bapa saya tidak menggunakan DependencyProperty dalam UserControl?

Kenapa Kemas Kini Property `SelectedFile 'ibu bapa saya tidak menggunakan DependencyProperty dalam UserControl?

DDD
DDDasal
2025-02-01 17:16:09478semak imbas

Why Doesn't My Parent ViewModel's `SelectedFile` Property Update When Using a DependencyProperty in a UserControl?

DependencyProperty mengikat masalah dan penyelesaian

Contoh ini menunjukkan kawalan penyemak imbas fail yang memaparkan laluan fail yang dipilih dalam kotak teks dan membolehkan fail melayari.

<code class="language-xml"><UserControl ... x:Class="Test.UserControls.FileBrowserControl">
    <Grid ...>
        <TextBox Text="{Binding SelectedFile}" />
    </Grid>
</UserControl></code>
Penggunaan kawalan adalah seperti berikut:
<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>

<:> Soalan:
<code class="language-xml"><FileBrowserControl Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*" SelectedFile="{Binding SelectedFile}" /></code>

Apabila mengklik butang "Semak imbas", kotak teks dalam kawalan penyemak imbas fail akan dikemas kini dengan betul, tetapi harta yang dipilih oleh Control Control ViewModel tidak akan ditetapkan.

punca akar:

Masalahnya adalah bahawa DataContext ditetapkan kepada dirinya sendiri dalam pembina FilebrowserControl kepada dirinya sendiri:

Konflik ini dengan warisan terikat kepada ViewModel, kerana ia memusnahkan sebarang atribut mengikat data yang mengikat mengikat menggunakan RelativativeSource.

Penyelesaian:
<code class="language-csharp">this.DataContext = this;</code>

Untuk menyelesaikan masalah ini, pengikatan dalam XAML usercontrol harus diubah suai:

Ini dapat memastikan bahawa harta yang dipilih akan terikat kepada atribut yang dipilih di bahagian kawalan induk, yang mewarisi datacontext kawalan ayahnya. Dengan menentukan

, pengikatan akan mendapati tahap induk UserControl, untuk mencari atribut yang betul.

Melalui pengubahsuaian di atas, atribut
<code class="language-xml"><TextBox Text="{Binding SelectedFile, RelativeSource={RelativeSource AncestorType=UserControl}}" /></code>
dari pandangan ibu bapa akan dikemas kini dengan betul.

Atas ialah kandungan terperinci Kenapa Kemas Kini Property `SelectedFile 'ibu bapa saya tidak menggunakan DependencyProperty dalam UserControl?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn