C# 自制水印文本框
我用下面的xaml制作了一个自己的水印文本框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
<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=TwoWayMode=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'}" />