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
Lepaskan: 2025-02-01 17:16:09
asal
528 orang telah melayarinya

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.

<UserControl ... x:Class="Test.UserControls.FileBrowserControl">
    <Grid ...>
        <TextBox Text="{Binding SelectedFile}" />
    </Grid>
</UserControl>
Salin selepas log masuk
Penggunaan kawalan adalah seperti berikut:
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 属性。
    }
}
Salin selepas log masuk

<:> Soalan:
<FileBrowserControl Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*" SelectedFile="{Binding SelectedFile}" />
Salin selepas log masuk

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:
this.DataContext = this;
Salin selepas log masuk

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
<TextBox Text="{Binding SelectedFile, RelativeSource={RelativeSource AncestorType=UserControl}}" />
Salin selepas log masuk
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 Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan