-1

我在具有依赖属性的用户控件和我有一个自定义类作为数据上下文中的模型的窗口之间存在半工作绑定的坏情况。

我的窗户

<src:BaseWindow x:Class="Levscan.Wpf.Controls.DialogWindows.SystemSettingsDialog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:src="clr-namespace:Levscan.Wpf.Controls.Abstract"
    xmlns:ctrl_io="clr-namespace:Levscan.Wpf.Controls.Controls.IO"
    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">

    <ctrl_io:DirectoryBrowser Width="250" SelectedPath="{Binding Path=PathInbox, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>
</src:BaseWindow>

我的用户控件

<UserControl Name="DirectoryBrowserUC" x:Class="Levscan.Wpf.Controls.Controls.IO.DirectoryBrowser"
         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="53" d:DesignWidth="392">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="8*" />
        <ColumnDefinition Width="2*" />
    </Grid.ColumnDefinitions>

    <TextBox Text="{Binding ElementName=DirectoryBrowserUC, Path=SelectedPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Style="{StaticResource TextBoxInError}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Column="0" Margin="5,0" />
    <Button Margin="5,0" Content="..." Grid.Column="1" Click="OnBrowse_Click" />
</Grid>

我的用户控件 - 代码背后

public partial class DirectoryBrowser : UserControl
{
    public static readonly DependencyProperty SelectedPathProperty =
        DependencyProperty.Register("SelectedPath", typeof(string), typeof(DirectoryBrowser));
    public string SelectedPath
    {
        get { return this.GetValue(SelectedPathProperty) as string; }
        set { this.SetValue(SelectedPathProperty, value); }
    }
}

当我启动我的窗口时,我加载了一个继承 INotifyPropertyChanged 接口的自定义类。设置新数据时,我的属性会执行 NotifyPropertyChanged()。

当我在用户控件中启动我的文本框时,我的窗口中的数据和窗口 DataContext 中的自定义类会更新(到目前为止一切都很好)。

但是,我注意到,当我直接编辑文本框(输入新文本)或使用它旁边的按钮并使用 Windows 目录对话框选择新路径时,我在 DataContext 中的属性没有更新。

我尝试了各种绑定变体,但没有任何效果,要么没有加载数据,要么我无法更改值。

我怀疑我的绑定在某个地方有点偏离。

更新

似乎我在上面的代码中需要的只是在控件窗口的绑定上添加 Mode=TwoWay 。由于我换掉了东西并添加了我从未注意到这是唯一缺少的东西,所以当我真正拥有它时,其他东西就消失了。

4

1 回答 1

2

在 SelectedPath 的绑定中添加 Mode=TwoWay。自定义依赖属性的默认绑定模式是 OneWay。

这并不神奇。首先,依赖属性有一个默认绑定模式。当您编写自己的依赖属性时,默认的“默认绑定模式”是 OneWay,您可以按照 Clemens 的建议将其覆盖为 TwoWay。如果您没有在用户控件级别指定绑定模式,WPF 将使用默认的绑定模式,即 OneWay。这解释了为什么数据上下文没有得到更新。

第二种绑定模式是在目标上定义的,而不是在源上定义的,所以无论 SelectedPath 上的默认绑定模式是什么,它都会从 TextBox 更新,因为 Text 属性的默认绑定模式是双向绑定(失去焦点)。

一句话。只需在您的用户控件级别显式添加双向绑定或覆盖 FrameworkPropertyMetadata 并默认提供双向绑定即可解决您的问题。

于 2013-07-23T13:55:37.020 回答