我使用以下xaml制作了我自己的WatermarkTextBox。
<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>
根据我所知,以下代码背后的代码并不是INotifyPropertyChanged
。这些DependencyProperty
应该足够了。
public String Watermark
{
get { return (String)GetValue(WatermarkProperty); }
set { SetValue(WatermarkProperty, value); }
}
public String Text
{
get { return (String)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty WatermarkProperty =
DependencyProperty.Register("Watermark", typeof(string),
typeof(WatermarkTextBox), new PropertyMetadata(""));
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string),
typeof(WatermarkTextBox), new PropertyMetadata(""));
然后,在我的应用程序中,我像这样使用它。
<c:WatermarkTextBox Watermark="[Design] Name *"
Text="{Binding Name, FallbackValue='Name'}" />
当我运行应用程序时,我确实看到&#34; [设计]名称*&#34;作为TextBlock中的水印。现在,在上面的示例中,我在我的ViewModel中将DP Text
绑定到属性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
永远不想出现在WatermarkTextBox中。即使我在运行时输入内容并请求属性Name
,它仍会返回null
。
这会让事情更清楚吗?
我用常规TextBox
测试了绑定。在这里,绑定看起来像它应该工作,并确实显示它有什么。我认为问题出在我的WatermarkTextBox中,但我不知道在哪里。
<TextBox Text="{Binding Name, FallbackValue='Name'}" />
答案 0 :(得分:1)
问题出现在WatermarkTextBox绑定中。为网格指定名称并将其DataContext设置为UserControl本身,因为您绑定到控件中的属性
<Grid x:Name="grid">
<TextBlock Margin="5 0 5 0"
xaml.cs
public partial class WatermarkTextBox : UserControl
{
public WatermarkTextBox()
{
InitializeComponent();
grid.DataContext = this;
}
我希望这会有所帮助。
更新:
<c:WatermarkTextBox Watermark="[Design] Name *"
Text="{Binding Name, Mode=TwoWay, FallbackValue='Name'}" />