Tasarım zamanını bir pencerede ayarlama Derleyici hatası veriyor mu?


203

Benim WPF uygulamasında ana pencere için aşağıdaki XAML var, d:DataContextbaşarıyla tüm çeşitli UserControls için yapabileceğim aşağıdaki tasarım süresini ayarlamaya çalışıyorum , ama bunu yapmaya çalıştığınızda bana bu hata veriyor pencere ...

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>

Yanıtlar:


263

mc:Ignorable="d"Pencere etiketine öznitelik eklemek gerekiyordu . Esasen yeni bir şey öğrendim. d:Expression Blend / Visual Studio tasarımcı aslında bir kabul etmeleriyle ad alanı öneki görmezden / "out yorumladı" gerçek derleyici / xaml çözümleyici tarafından!

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

Aşağıdakiler alındı

Nathan, Adam (2010-06-04). WPF 4 Serbest Bırakıldı (Kindle Locations 1799-1811). Sams. Kindle Sürümü.

İşaretleme Uyumluluğu

İşaretleme uyumluluğu XML ad alanı ( http://schemas.openxmlformats.org/markup-compatibility/2006 , genellikle bir mcönekle kullanılır ), XAML işlemcilere, belirtilen ad alanlarındaki tüm öğeleri / öznitelikleri yoksaymaları yoksayar .NET türlerine / üyelerine çözümlenmelidir. (Ad alanında ayrıca, yok sayılan ad alanlarındaki belirli türler için Geçersizleştirilebilir'i geçersiz kılan bir ProcessContent özniteliği bulunur.)

Expression Blend, XAML içeriğine çalışma zamanında yok sayılabilecek tasarım zamanı özellikleri ekleme gibi şeyler yapmak için bu özellikten yararlanır.

mc:Ignorableboşlukla sınırlandırılmış ad alanlarının bir listesi verilebilir ve mc: ProcessContent'a alanla sınırlandırılmış bir öğe listesi verilebilir. XamlXmlReader çözülemeyen cahil içerikle karşılaştığında, bunun için herhangi bir düğüm rapor etmez. Cahil içerik çözülebilirse, normal olarak raporlanır. Dolayısıyla, tüketicilerin biçimlendirme uyumluluğunu doğru bir şekilde işlemek için özel bir şey yapmaları gerekmez.


12
Bir süredir kafamı buna çarpıyorum. Mantıklı, ancak büyük bir gözetim gibi görünüyor (tasarım zamanı veri nesneleri tüm bu hack'ler olmadan desteklenmelidir)
Basic

3
Öznitelik olarak kendi düğümünde cahil veri bağlamı istiyorsanız <d: Window.DataContext />
ChéDon

Büyük ipucu, garip bir derleyici istisnası ile çabalamak bana yardımcı oldu. Mc: cahil olmadan, d: DataContext'i ayarlasam bile, XAML derleyicisi bunu DataContext'i ayarlamaya çalışmak olarak yorumladı ve yanlış xmlns ad alanını kullanma konusunda şikayet etti.
Tore Aurstad

19

Vay be, ne acı! Umarız MS, x: Bind için bazı VS tasarım zamanı desteği sunar.

VS tasarımcısını kullanabiliyoruz ancak aynı zamanda Binding yerine x: Bind'e kolayca geçebiliyoruz. İşte yaptım:

  • Benim Görünümünde, ViewModel almak için bir özellik ekledim. Bu mantıklıdır, çünkü x: Bağlama yolları Sayfaya göreli (örn. Görünüm nesnesi).

  • Sayfa XAML'imde XAML'ın <Page ... >üst kısmına aşağıdakileri ekledim :

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

Bu şekilde, Sayfanın gerçek veri içeriği nedeniyle Sayfa kendisi ayarlanır {x:Bind}. Bunun nedeni x:Bind, Sayfa ile ilgilidir ve herhangi bir yol yoktur.

Aynı zamanda, d:DataContexthat nedeniyle VS tasarımcısı, VS tasarımcısı etkileşimi amacıyla MyView sınıfına (bir örnek oluşturmadan) yansır. Bu, MyView'den VS tasarımına izin verir, burada ViewModel özelliğine ilerleyebilir, genişletebilir ve bağlamak istediğiniz öğeyi seçebilirsiniz.

Tüm bunları yaptığınızda, VS tasarımcısı yolu Görünüm'e göreceli olan bir Bağlayıcı ifadesi oluşturur, yani x: Bağlamanın beklediği yolla tamamen aynıdır. Bu nedenle, x: Bind'e daha sonra geçmek isterseniz, tüm " {Binding" ile " {x:Bind" kelimesini arayabilir ve değiştirebilirsiniz .

d:DataContextVS'ye hangi sınıfa bakacağını söylemek için neden hatta ihtiyacımız var ? İyi bir soru, çünkü VS'nin sonraki satırı kullanarak DataContext'i kullanarak Sayfaya ayarlayabileceğini düşünürdünüz DataContext={x:Bind}. Devam edin ve deneyin, işe yaramıyor ve x: Kendine göre Ciltlemeye Bağla'yı değiştirirseniz de çalışmıyor.

Umarım bu durum MS tarafından temizlenir !!


3
WPF x: Bind'i desteklemez; bu cevap OP için işe yaramaz.
Byrel Mitchell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.