2011-11-28 50 views
171

我在下面的WPF應用程序的主窗口下面的XAML,我試圖設置下面的設計時間d:DataContext,我可以成功地爲我所有的各種UserControls做,但它會給我這個錯誤,當我嘗試做它在窗上...在窗口上設置設計時間DataContext是否給出編譯器錯誤?

Error 1 The property 'DataContext' must be in the default namespace or in the element namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. Line 8 Position 9. C:\dev\bplus\PMT\src\UI\MainWindow.xaml 8 9 UI

<Window x:Class="BenchmarkPlus.PMT.UI.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:UI="clr-namespace:BenchmarkPlus.PMT.UI" 
    xmlns:Controls="clr-namespace:BenchmarkPlus.PMT.UI.Controls" 
    d:DataContext="{d:DesignInstance Type=UI:MainViewModel, IsDesignTimeCreatable=True}" 
    Title="MainWindow" Height="1000" Width="1600" Background="#FF7A7C82"> 

    <Grid> 
     <!-- Content Here --> 
    </grid> 

</Window> 

回答

230

我需要的mc:Ignorable="d"屬性添加到窗口標籤。基本上我學到了一些新東西。 Expression Blend/Visual Studio設計器確認的d:命名空間前綴實際上是被真正的編譯器/ xaml解析器忽略/「註釋掉」

<Window 
... 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
... 
/> 

下面從

Nathan, Adam (2010-06-04). WPF 4 Unleashed (Kindle Locations 1799-1811). Sams. Kindle Edition.

標記兼容性

的標記兼容性XML命名空間(http://schemas.openxmlformats.org/markup-compatibility/2006,通常用mc前綴使用)包含指示可忽略的屬性取如果XAML處理器無法解析,則忽略指定名稱空間中的所有元素/屬性到他們的.NET類型/成員。 (該命名空間還具有一個ProcessContent屬性,該屬性將忽略忽略名稱空間內的特定類型的Ignible。)

Expression Blend利用此功能執行諸如將設計時屬性添加到可在運行時忽略的XAML內容。

mc:Ignorable可以給出空格分隔的名稱空間列表,而mc:ProcessContent可以給出空格分隔的元素列表。當XamlXmlReader遇到無法解析的可忽略內容時,它不會爲其報告任何節點。如果可以解決可忽略的內容,則會正常報告。因此,消費者不需要做任何特別的事情來正確處理標記兼容性。

+11

我一直在打擊我的頭相當一段時間。有意義,但看起來像一個巨大的監督(設計時數據對象應該支持沒有所有這些黑客) – Basic

+1

如果你想在其自己的節點,而不是作爲一個屬性使用可忽略的數據上下文 –

11

哇,真是痛苦!讓我們希望MS爲x:綁定提供一些VS設計時支持。

我們能夠使用VS設計器,但也能夠輕鬆切換到x:綁定而不是綁定。以下是我所做的:

  • 在我的視圖中,我添加了一個屬性來獲取我的ViewModel。這很有意義,因爲x:綁定路徑是相對於頁面(即視圖對象)的。

  • 在我的頁面的XAML,我添加了以下到<Page ... >在XAML的頂部:

    mc:Ignorable="d" 
    d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}" 
    DataContext="{x:Bind}" 
    

這種方式,頁面的實際數據上下文設置爲頁面本身因{x:Bind}。這是因爲x:Bind與Page相關,並且沒有給出路徑。

與此同時,由於d:DataContext這一行,VS設計師反映了MyView類(不創建實例)以達到VS設計器交互的目的。這樣可以從MyView中進行VS設計,然後可以向下滾動到ViewModel屬性,展開它並選擇要綁定到的項目。

當你這麼做的時候,VS設計器會創建一個綁定語句,其路徑與視圖相關,即它恰好與x:Bind所期望的路徑相同。因此,如果您想切換到x:稍後綁定,則可以搜索並將所有「{Binding」替換爲「{x:Bind」。

爲什麼我們甚至需要d:DataContext一行來告訴VS要看什麼類?好問題,因爲你會認爲VS可以找出下一行將DataContext設置爲頁面,使用DataContext={x:Bind}。繼續嘗試吧,它不起作用,並且如果您更改x:綁定到相對於自我的綁定,它也不起作用。

希望這種情況將得到MS清理!