Rumah >pembangunan bahagian belakang >C++ >Kenapa Kemas Kini Property `SelectedFile 'ibu bapa saya tidak menggunakan DependencyProperty dalam UserControl?
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!