DependencyProperty绑定问题

DependencyProperty绑定问题

我创建了一个小文件浏览器控件:

<UserControl x:Class="Test.UserControls.FileBrowserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="44" d:DesignWidth="461" Name="Control">
    <Grid Margin="3">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBox  Margin="3" Text="{Binding SelectedFile}" IsReadOnly="True" TextWrapping="Wrap" />
        <Button HorizontalAlignment="Right" Margin="3" Width="100" Content="Browse" Grid.Column="1" Command="{Binding BrowseCommand}" />
    </Grid></UserControl>


我就是这样用的:

<userControls:FileBrowserControl SelectedFile="{Binding SelectedFile}" Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*"/>

(SelectedFile是使用此控件的用户控件的ViewModel的属性)

当前的问题是,当我单击Browse时,user控件中的TextBox正在正确更新,但viewModel父控件的SelectedFile属性没有设置(没有调用set属性)。

如果我将绑定模式设置为twoway,则会得到以下异常:

An unhandled exception of type 'System.StackOverflowException' occurred in Unknown Module.

那我做错什么了?


慕尼黑的夜晚无繁华
浏览 748回答 3
3回答

喵喔喔

主要问题是在其构造函数中将UserControl的DataContext设置为自身:DataContext&nbsp;=&nbsp;this;不应该这样做,因为它破坏了任何基于DataContext的绑定,例如对继承的DataContext值中的视图模型实例。相反,您将更改UserControl的XAML中的绑定,如下所示:<TextBox&nbsp;Text="{Binding&nbsp;SelectedFile, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RelativeSource={RelativeSource&nbsp;AncestorType=UserControl}}"&nbsp;/>现在,当您使用UserControl并编写一个绑定时,如下所示<userControls:FileBrowserControl&nbsp;SelectedFile="{Binding&nbsp;SelectedFile}"&nbsp;/>SelectedFile属性绑定到视图模型中的SelectedFile属性,该属性应位于从父控件继承的DataContext中。

温温酱

使用此方法:<userControls:FileBrowserControl&nbsp;SelectedFile="{Binding&nbsp;SelectedFile}"&nbsp;...FileBrowserControl的DataContext已经设置为自身,因此您实际上要求绑定到SelectedFile,其中DataContext是FileBrowserControl,而不是父ViewModel。给视图一个名称,然后使用ElementName绑定。SelectedFile="{Binding&nbsp;DataContext.SelectedFile,&nbsp;ElementName=element}"
打开App,查看更多内容
随时随地看视频慕课网APP