更改控件内特定属性的DataContext - WPF

时间:2013-03-03 20:28:54

标签: wpf mvvm datacontext

我有用户控件,其中包含带有WaterMark的TextBox

<AdornerDecorator>
                        <TextBox 
                            Height="20" 
                            Margin="10,0" 
                            Grid.Column="0" 
                            Text="{Binding MainCategoryTextBoxValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Name="MainCatTextBox">

                            <controls:WatermarkService.Watermark>
                                <TextBlock VerticalAlignment="Center" x:Name="MainCategoryTextBlock"> </TextBlock>
                            </controls:WatermarkService.Watermark>
                        </TextBox>
</AdornerDecorator>

您可以在此处看到WatermarkService实现 https://stackoverflow.com/a/836463/1548347

我想在<controls:WatermarkService.Watermark>中取“MainCategoryTextBlock”文本块并将其设置为与我的UserControl DataContext相同,以便从我的ViewModel更改RunTime中的水印文本。

我尝试将“MainCategoryTextBlock”DataContext与RelativeSource绑定到我的UserControl DataContext但是我没有成功(可能是语法错误 - 我不确定)。

DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" 

你有什么线索我能解决吗?

由于

2 个答案:

答案 0 :(得分:0)

您应该将窗口的数据上下文属性设置为视图模型,并将文本块的text属性绑定到视图模型属性。

<TextBlock Text={Binding Path=PropertyOnViewModel} />

答案 1 :(得分:0)

如果您的UserControl有一个名称,那么您可以这样做:

DataContext={Binding ElementName="YourUserControlName", Path=DataContext}

但是我可以看到您在装饰器装饰器中使用文本框,因此在这种情况下您不能使用FindAncestor,因为您的文本框和UserControl不属于同一个可视树。