2013-03-03 26 views
0

我有一個包含內部變更DataContext的內部控制 - WPF

<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」文本塊用戶控制並將其DataContext設置爲與我的UserControl DataContext相同,以便從ViewModel更改RunTime中的水印文本。

我試圖將「MainCategoryTextBlock」DataContext與RelativeSource綁定到我的UserControl DataContext,但我沒有成功(可能語法錯誤 - 我不知道)。

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

你有什麼線索我該如何解決它?

感謝

回答

0

您應該在窗口的數據上下文屬性被設置爲您的視圖模型,你的文字塊的文本屬性綁定到您的視圖模型屬性。

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

我不能使用這種方法。我從代碼中設置了我的觀點的數據上下文(基於PRISM的應用程序)。如果我將從我的視圖中創建實例並執行您的建議,我將獲得2個ViewModel實例。 – Ofir 2013-03-05 04:38:08

0

如果你的用戶控件有一個名字,那麼你可以做這樣的:

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

,但我可以看到你正在使用的裝飾器裝飾裏面你的文本框,所以你不能在使用FindAncestor這種情況是因爲你的文本框和你的UserControl不屬於同一個可視化樹。

+0

我試圖給我的UserControl名稱,但我得到下一條消息: – Ofir 2013-03-04 17:21:33

+0

@Ofir什麼消息? – 2013-03-04 19:05:04

+0

哦,對不起。以下是消息: 錯誤2:類型'DataPresenterModule.DataPresenterModule'中不存在類型名稱'Views'。 同時我以其他方式解決了這個問題,但我仍然好奇我該如何解決這個問題 – Ofir 2013-03-04 19:26:07