C# 自制水印文本框

C# 自制水印文本框,c#,wpf,binding,C#,Wpf,Binding,我用下面的xaml制作了一个自己的水印文本框 <Grid> <TextBlock Margin="5 0 5 0" VerticalAlignment="Center" Foreground="{Binding WatermarkForeground, FallbackValue=#DBDBDB}" Text="{Binding Watermark, FallbackValue=T

我用下面的xaml制作了一个自己的水印文本框

<Grid>
    <TextBlock Margin="5 0 5 0"
               VerticalAlignment="Center"
               Foreground="{Binding WatermarkForeground, FallbackValue=#DBDBDB}"
               Text="{Binding Watermark, FallbackValue=This prompt dissappears as you type...}"
               Visibility="{Binding ElementName=txtUserEntry, Path=Text.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}" />
    <TextBox Name="txtUserEntry"
             Background="Transparent"
             BorderThickness="0"
             Foreground="{Binding TextForeground, FallbackValue=Black}"
             VerticalAlignment="Center"
             Text="{Binding Text}" />
</Grid>
然后,在我的应用程序中,我像这样使用它

<c:WatermarkTextBox Watermark="[Design] Name *"
                    Text="{Binding Name, FallbackValue='Name'}" />
public string Name { get; set; }
ViewModel确实实现了INotifyPropertyChanged

public class MainWindowViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
在我的ViewModel中,如果我按下一个按钮,我将执行以下代码

Name = "Test";
单词
Test
永远不想出现在水印文本框中。即使我在运行时在其中键入内容并请求属性
Name
,它仍将返回
null

这能让事情更清楚吗


我用一个常规的
文本框测试了绑定。在这里,绑定似乎工作正常,并且确实显示了它必须做的事情。我想问题出在我的水印文本框内,但我不知道在哪里

<TextBox Text="{Binding Name, FallbackValue='Name'}" />

这个问题似乎出现在您的水印文本框绑定中。为网格指定一个名称,并将其DataContext设置为UserControl本身,因为您要绑定到控件中的属性

        <Grid x:Name="grid">
        <TextBlock Margin="5 0 5 0"
我希望这会有所帮助

更新:



你的问题毫无意义。。。你应该先读一读再发。您(粗略地)说过,“当我设置
水印
属性时,我的控件起作用,但当我设置
名称
属性时,控件不起作用”。。。当您设置不同的属性时,为什么它会做相同的事情?您的
Name
属性与
Watermark
属性之间的关系是什么?您的代码和xaml不完整,是否正在尝试创建customcontrol?请您发布完整的代码和xaml。我刚刚注意到你的c:水印文本框。如果您正在创建cc,那么您的绑定在模板中是错误的,您必须这样做。您的Name auto属性(在vm上?)不会更新ui,您必须实现INotifyPropertyChanged接口。WatermarkTextBox是否还必须包含
INotifyPropertyChanged
,因为我将名称绑定到控件的类实现了它?@Sheridan,当人们看到回复时,你必须给他们时间编辑他们的帖子。一个简短的回复比编辑我的帖子和添加更多信息要快。现在检查它。这确实解决了不显示属性
Name
的值的问题。比方说,我将属性设置为值“TestCompany”。当我把它改为“TestCompanyAgain”时,它仍然会返回“TestCompany”。是否需要更多的代码来查找发生这种情况的原因?请在设置属性时检查其通知属性是否已更改。如果我设置了属性
名称
NotifyPropertyChanged()开火。出于测试目的,我还将
UpdateSourceTrigger
设置为
PropertyChanged
。当我更改
文本框中的文本时,
NotifyPropertyChanged()未被激发。我更新了答案。您需要在水印文本框的绑定中设置Mode=TwoWay
Mode=TwoWay
修复了我的问题,现在问题已经完全修复。我一直认为默认情况下它是双向的,但似乎只有某些控件。
        <Grid x:Name="grid">
        <TextBlock Margin="5 0 5 0"
public partial class WatermarkTextBox  : UserControl
{
    public WatermarkTextBox()
    {
        InitializeComponent();
        grid.DataContext = this;
    }
        <c:WatermarkTextBox Watermark="[Design] Name *"
                Text="{Binding Name,  Mode=TwoWay, FallbackValue='Name'}" />