창에서 디자인 시간을 DataContext로 설정하면 컴파일러 오류가 발생합니까?


203

WPF 응용 프로그램의 기본 창에 대해 다음 XAML이 아래에 있습니다. 아래의 디자인 시간을 설정하려고합니다. d:DataContext이 모든 다양한 UserControls에 대해 성공적으로 수행 할 수 있지만 창문...

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>

답변:


263

mc:Ignorable="d"Window 태그에 속성 을 추가해야했습니다 . 본질적으로 나는 새로운 것을 배웠다. d:Expression Blend / Visual Studio 디자이너가 인정 하는 네임 스페이스 접두사 는 실제 컴파일러 / xaml 파서에 의해 실제로 무시 / 코멘트됩니다 !

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

다음에서 가져온 것입니다

나단, 아담 (2010-06-04). WPF 4 해방 (Kindle Locations 1799-1811). 샘스 킨들 에디션.

마크 업 호환성

태그 호환성 XML 네임 스페이스 ( 일반적으로 접두사 와 함께 사용되는 http://schemas.openxmlformats.org/markup-compatibility/2006mc )에는 XAML 프로세서가 지정된 네임 스페이스의 모든 요소 / 속성을 무시할 수없는 경우이를 무시하도록 지시하는 무시할 수없는 속성이 포함되어 있습니다. .NET 유형 / 멤버로 확인됩니다. 네임 스페이스에는 또한 무시 된 네임 스페이스 내의 특정 유형에 대해 무시할 수있는 ProcessContent 속성이 있습니다.

Expression Blend는이 기능을 활용하여 런타임에 무시할 수있는 디자인 타임 속성을 XAML 콘텐츠에 추가하는 등의 작업을 수행합니다.

mc:Ignorable공백으로 구분 된 네임 스페이스 목록을 제공 할 수 있으며 mc : ProcessContent는 공백으로 구분 된 요소 목록을 제공 할 수 있습니다. XamlXmlReader에서 해결할 수없는 무시할 수있는 컨텐츠가 발견되면이를보고하는 노드가 없습니다. 무시할 수있는 내용을 해결할 수 있으면 정상적으로보고됩니다. 따라서 소비자는 마크 업 호환성을 올바르게 처리하기 위해 특별한 작업을 수행 할 필요가 없습니다.


12
나는 이것에 대해 꽤 오랫동안 내 머리를 때렸다. 이해가되지만 엄청난 감독 인 것 같습니다 (디자인 타임 데이터 객체는 이러한 모든 해킹없이 지원되어야 함)
기본

3
속성 대신 자체 노드에서 무시할 수있는 데이터 컨텍스트를 원하면 <d : Window.DataContext />
ChéDon

좋은 팁은 이상한 컴파일러 예외로 어려움을 겪는 데 도움이되었습니다. mc : ignorable이 없으면 d : DataContext를 설정하더라도 XAML 컴파일러는 DataContext를 설정하려고 시도한 것으로 해석하고 잘못된 xmlns 네임 스페이스 사용에 대해 불평했습니다.
Tore Aurstad 2016 년

19

와, 정말 아 pain니다! MS가 x : Bind에 대한 VS 디자인 타임 지원을 제공하기를 바랍니다.

VS 디자이너를 사용할 수 있지만 바인딩 대신 x : Bind로 쉽게 전환 할 수 있습니다. 내가 한 일은 다음과 같습니다.

  • 내 View에서 ViewModel을 얻기 위해 속성을 추가했습니다. x : Bind 경로는 Page (즉, View 객체)를 기준으로하기 때문에 이것은 의미가 있습니다.

  • 내 페이지 XAML에서 XAML <Page ... >의 맨 위에 다음을 추가했습니다 .

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

이런 식으로 페이지의 실제 데이터 컨텍스트는로 인해 페이지 자체로 설정됩니다 {x:Bind}. 때문이다 x:Bind페이지를 기준으로 주어진 어떤 경로가 없습니다.

동시에 d:DataContextVS 디자이너는 VS 디자이너 상호 작용을 위해 인스턴스를 만들지 않고 MyView 클래스에 반영합니다. MyView의 VS 디자인을 사용하면 ViewModel 속성으로 스크롤하여 확장하고 바인딩하려는 항목을 선택할 수 있습니다.

모든 작업을 수행하면 VS 디자이너는 경로가 View에 상대적인 Binding 문을 만듭니다. 즉, x : Bind가 예상하는 경로와 정확히 동일합니다. 따라서 나중에 x : Bind로 전환하려면 모든 " {Binding"를 검색하고 " "로 바꿀 수 있습니다 {x:Bind.

d:DataContextVS에게 어떤 클래스를보아야하는지 알려 주어야하는 이유는 무엇입니까? VS가 다음 줄을 사용하여 DataContext를 Page로 설정하여 페이지를 설정할 수 있다고 생각하기 때문에 좋은 질문 DataContext={x:Bind}입니다. x : Bind를 self를 기준으로 Binding으로 변경하면 작동하지 않으며 작동하지 않습니다.

잘만되면이 상황은 MS에 의해 정리 될 것이다!


3
WPF는 x : Bind를 지원하지 않습니다. 이 답변은 OP에는 작동하지 않습니다.
Byrel Mitchell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.