【问题标题】:Datacontext conflicts数据上下文冲突
【发布时间】:2014-10-31 04:40:20
【问题描述】:
<UserControl x:Class="WatermarkTextBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             d:DesignHeight="30"
             d:DesignWidth="250">
    <UserControl.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    </UserControl.Resources>
    <Border>
        <Grid x:Name="grid">
            <TextBlock Text="{Binding Watermark, FallbackValue=This prompt dissappears as you type...}"
                       Visibility="{Binding ElementName=txtUserEntry, Path=Text.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}" />
            <TextBox Name="txtUserEntry"
                     Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
        </Grid>
    </Border>
</UserControl>

上面的代码显示了我的WatermarkTextBox 控件。在文件后面的代码中,我设置了DataContext。我省略了控件的 DP 的所有代码。

public WatermarkTextBox()
{
    InitializeComponent();
    grid.DataContext = this;
}

我必须将DataContext 绑定到网格,否则水印和实际文本的Text 属性将不会显示。现在的问题是我不能在Grid之外设置BorderBackground

我尝试了下面的代码,但只设置了BorderBackground,而不是水印和实际文本。

public WatermarkTextBox()
{
    InitializeComponent();
    this.DataContext = this;
    grid.DataContext = this;
}

【问题讨论】:

    标签: wpf binding datacontext


    【解决方案1】:

    在这样的 UserControl 中,您永远不应该将 DataContext 显式设置为 this 或其他任何内容,因为当您在应用程序中的某处使用 UserControl 时,通常会在外部设置 DataContext。外部应用的 DataContext 通常是(部分)应用程序的视图模型。

    您应该改为更改您的内部绑定,以便它们使用显式的RelativeSource

    <TextBlock
        Text="{Binding Path=Watermark,
                       RelativeSource={RelativeSource AncestorType=UserControl},
                       FallbackValue=This prompt dissappears as you type...}"
        Visibility="{Binding ElementName=txtUserEntry,
                             Path=Text.IsEmpty,
                             Converter={StaticResource BooleanToVisibilityConverter}}" />
    <TextBox
        Name="txtUserEntry"
        Text="{Binding Path=Text,
                       UpdateSourceTrigger=PropertyChanged,
                       RelativeSource={RelativeSource AncestorType=UserControl}}" />
    

    然后从 UserControl 的构造函数中删除任何 DataContext 分配。

    参见例如this answer(和许多其他类似的)详细讨论了这个话题。

    【讨论】:

    • 感谢您提供解决方案和额外信息链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2017-01-29
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多