WPF에서 더미 디자인 타임 데이터에 사용할 수있는 접근 방식은 무엇입니까?


97

식 혼합없이 작업하고 있으며 vs2010에서 XAML 편집기를 사용하고 있습니다. 이것의 지혜는 제쳐두고 디자인 타임 데이터 바인딩에 대한 필요성이 점점 더 커지고 있습니다. 간단한 경우에는 FallbackValue속성이 매우 잘 작동합니다 (Textboxes 및 TextBlocks 등). 그러나 특히 등을 다룰 때 ItemsControl실행 파일을 실행하지 않고도 컨트롤과 데이터 템플릿을 조정하고 조정할 수 있도록 디자이너에서 볼 수있는 샘플 데이터가 실제로 필요합니다.

나는 그것이 알고 ObjectDataProvider시각화의 디자인 타임 데이터를 제공 할 수있다, 따라서 유형의 바인딩을 허용하고, 그러나로드로드하여 설계 시간을 모두 자원을 낭비하지 않고 바인드의 실제, 런타임 데이터를 수 있도록 몇 가지 저글링이있다, 더미 데이터 및 런타임 바인딩.

내가 원하는 것은 "John", "Paul", "George"및 "Ringo"가 내에서 스타일 가능한 항목으로 XAML 디자이너에 ItemsControl표시되지만 응용 프로그램이 표시 될 때 실제 데이터가 표시되도록하는 기능입니다. 실행합니다.

또한 Blend는 런타임 조건에서 WPF가 효과적으로 무시하는 디자인 타임 바인딩 데이터를 정의하는 멋진 특성을 허용한다는 것을 알고 있습니다.

그래서 내 질문은 다음과 같습니다.

1. Visual Studio XAML 디자이너에서 컬렉션 및 중요하지 않은 데이터의 디자인 타임 바인딩을 활용 한 다음 런타임 바인딩으로 원활하게 전환하려면 어떻게해야합니까?

2. 다른 사람들은이 디자인 타임 대 런타임 데이터 문제를 어떻게 해결 했습니까? 제 경우에는 둘 다에 대해 동일한 데이터를 매우 쉽게 사용할 수 없습니다 (예를 들어 데이터베이스 쿼리로 할 수있는 것처럼).

3. 데이터 통합 ​​XAML 디자인에 사용할 수있는 식 혼합의 대안이 있습니까? (몇 가지 대안이 있다는 것을 알고 있지만 특별히 사용할 수 있고 바인딩 된 샘플 데이터 등을 볼 수있는 것을 원합니까?)

답변:


120

VS2010을 사용하면 디자인 타임 속성을 사용할 수 있습니다 (SL 및 WPF 모두에서 작동). 어쨌든 나는 보통 모의 데이터 소스를 가지고 있으므로 다음과 같은 문제입니다.

  • 네임 스페이스 선언 추가

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  • 창 / 제어 리소스에 모의 데이터 컨텍스트 추가

    <UserControl.Resources>
      <ViewModels:MockXViewModel x:Key="DesignViewModel"/>
    </UserControl.Resources>
  • 디자인 타임 데이터 컨텍스트 설정

    <Grid d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ...

충분히 잘 작동합니다.


2
당신이 사용하는 데 문제가있는 경우 d:DataContext이 문제의 도움을 찾을 수 있습니다 : stackoverflow.com/questions/8303803/...
마틴 Liversage

27
이 예제로 인해 MockXViewModel 인스턴스가 릴리스 빌드 용 리소스에로드되지 않습니까? 이것이 문제가되지 않습니까?
jpierson 2012 년

12
참고 : 당신은 또한 다음을 필요로하거나, VS2012 컴파일러는 XAML 파일을 컴파일되지 않습니다 : xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"
오리온 에드워즈에게

51
jpierson이 맞습니다. 나는 <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" .... 이렇게하면 모의 된 뷰 모델이 응용 프로그램을 실행하는 동안이 아니라 디자이너에서만 생성됩니다. 이 방법을 사용하려면 모의보기 모델에 매개 변수가없는 생성자가 있어야합니다. 그러나 위의 답변에 주어진 예의 경우도 마찬가지입니다.
René

2
@ René 귀하의 접근 방식이 훨씬 좋습니다. 답변으로 추가하고 나는 그것을 위해 투표를하십시오
dss539

15

Goran의 받아 들여진 답변과 Rene의 훌륭한 의견이 합쳐져 있습니다.

  • 네임 스페이스 선언을 추가하십시오. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  • 코드에서 디자인 타임 데이터 컨텍스트를 참조하십시오.
    <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...


1
나는 이것을 새로운 대답으로 표시하고 싶지만 나머지 세부 사항을 가져올 수 있습니다.
el2iot2

이것은 더 많은 가시성이 필요하거나 수용된 답변으로 끌어 와야합니다. 훨씬 더 나은 솔루션입니다.
Lauraducky

왜 이것이 더 낫습니까? 처음에는 받아 들여진 대답이 런타임에서도 불필요하게 모의 모델을 생성 할 것이라고 생각했지만 실제로 테스트하지 않았습니다. 사용하지 않으면 리소스가 생성되지 않습니다.
Paul

@Paul 실제로 선호도의 문제이지만이 답변은 전체 디자인 타임 데이터 컨텍스트를 하나의 선언으로 유지하는 대신 두 위치에 두는 것입니다. 보다 쉬운 변경
John Stritenberger

1
@JohnStritenberger 그저 선호하는 것이 아니라 수용된 대답은 디자이너뿐만 아니라 항상 메모리에 리소스를 불필요하게로드합니다.
UuDdLrLrSs

4

Karl Shifflett는 VS2008 및 VS2010에서 똑같이 잘 작동해야하는 접근 방식을 설명합니다.

WPF 및 Silverlight 프로젝트의 Visual Studio 2008 Cider Designer에서 디자인 타임 데이터보기

Laurent Bugnion은 Expression Blend에 중점을 둔 유사한 접근 방식을 사용합니다. 그것은 VS2010 작동,하지만 난 아직 확인하지 않았습니다.

Microsoft Expression Blend의 디자인 모드에서 데이터 시뮬레이션


관심을 가져 주셔서 감사합니다. 나는 DesignAndRunTimeDataContext 개념을 좋아합니다.
el2iot2

1
Karl Shifflett가 Visual Studio 2010에 대한 업데이트 된 기사 : WPF 및 Silverlight 디자이너의 샘플 데이터
totorocat

1
특히 첫 번째 링크가 이제 죽었 기 때문에 링크 콘텐츠의 요점은 실제로 답변으로 편집되어야합니다.
Lauraducky

4

Visual Studio 2010 및 Expression Blend 4의 새로운 디자인 타임 기능이 옵션이 될 수 있습니다.

작동 방식은 WPF WAF (Application Framework)BookLibrary 샘플 애플리케이션에 나와 있습니다. .NET4 버전을 다운로드하십시오.


링크 주셔서 감사합니다. 접근 방식을 확인하기 위해 살펴 봐야 할 특정 코드 파일이나 구성이 있습니까? (간단한 개요가 좋을 것입니다)
el2iot2

BookLibrary.Presentation 프로젝트를 살펴보십시오. 이 프로젝트에서 "Views"폴더에서 UserControls에 의해 사용되는 "DesignData"폴더를 찾을 수 있습니다.
jbe 2010

1
+1. 이걸 봤어요. 관심있는 사람을 위해 샘플 데이터 뷰 모델은 XAML로 선언되고 d : DataContext = "{d : DesignData Source = .. / DesignData / SampleLendToViewModel.xaml}"을 통해 참조됩니다.
RichardOD

4

.NET 4.5 및 Visual Studio 2013에서 디자인 타임 데이터를 생성하는 데이 접근 방식을 사용합니다.

ViewModel이 하나뿐입니다. 뷰 모델에는 IsInDesignMode디자인 모드가 활성화되었는지 여부를 알려주 는 속성 이 있습니다 (class 참조 ViewModelBase). 그런 다음 뷰 모델 생성자에서 디자인 타임 데이터 (항목 컨트롤 채우기와 같은)를 설정할 수 있습니다.

게다가 뷰 모델 생성자에서 실제 데이터를로드하지 않을 것입니다. 이로 인해 런타임에 문제가 발생할 수 있지만 디자인 타임에 데이터를 설정하는 것은 문제가되지 않습니다.

public abstract class ViewModelBase
{
    public bool IsInDesignMode
    {
        get
        {
            return DesignerProperties.GetIsInDesignMode(new DependencyObject());
        }
    }
}

public class ExampleViewModel : ViewModelBase
{
    public ExampleViewModel()
    {
        if (IsInDesignMode == true)
        {
            LoadDesignTimeData();
        }
    }

    private void LoadDesignTimeData()
    {
        // Load design time data here
    }       
}

4

Visual Studio 2017을 사용하여 저는 이와 같은 모든 가이드와 질문을 따르려고 노력해 왔으며 .NET 에서 상속 <ItemsControl>하는 생성자 내부에있는 코드를 실행하지 않은 . 이 "편리한"MSDN 가이드 (스포일러 : 디버깅)에 따라 "실행하지 않음"부분을 확인했습니다 . 이것은 원래 질문과 직접적인 관련이 없지만 다른 사람들에게 많은 시간을 절약하기를 바랍니다.DesignFooViewModelFooViewModelMessageBox

내가 잘못한 것이 없다는 것이 밝혀졌다. 문제는 내 애플리케이션을 x64 용으로 빌드해야한다는 것입니다. 는 AS 비주얼 스튜디오 2018에서 여전히 32 비트 프로세스입니다 디자이너 부분에 대한 64 비트 호스트 프로세스를 회전 할 수 분명히 그것은 내 64 클래스를 사용할 수 없습니다. 정말 나쁜 점은 내가 생각할 수있는 어떤 로그에도 오류가 없다는 것입니다.

(예 : 당신이 당신의 디자인 타임 뷰 모델에 가짜 데이터를 확인할 수 있기 때문에 그래서 당신은이 질문에 우연히없는 경우 <TextBlock Text="{Binding Name}"/>쇼까지 Name더 당신이 속성을 설정 문제) 원인이 가능성이 64 빌드 할 수 있습니다. 종속성으로 인해 빌드 구성을 anycpu 또는 x86으로 변경할 수없는 경우 완전히 anycpu이고 종속성 (또는 종속성)이없는 새 프로젝트를 만드는 것이 좋습니다. 따라서 코드의 초기화 부분을 제외한 대부분 또는 전부를 "WPF 앱"프로젝트에서 "C # 클래스 라이브러리"프로젝트로 분할하게됩니다.

내가 작업중인 코드베이스의 경우 이것이 아마도 순 긍정적 인 일부 코드 중복의 대가로 문제의 건전한 분리를 강요 할 것이라고 생각합니다.


3

최고 평점 답변과 비슷하지만 내 의견으로는 더 좋습니다. 정적 속성을 만들어 디자인 데이터의 인스턴스를 반환하고 XAML에서 직접 참조 할 수 있습니다.

<d:UserControl.DataContext>
    <Binding Source="{x:Static designTimeNamespace:DesignTimeViewModels.MyViewModel}" />
</d:UserControl.DataContext>

이렇게하면을 사용할 필요가 없습니다 UserControl.Resources. 정적 속성은 중요하지 않은 데이터 유형을 구성 할 수있는 팩토리 역할을 할 수 있습니다. 예를 들어 기본 ctor가없는 경우 여기에서 팩토리 또는 컨테이너를 호출하여 적절한 종속성을 삽입 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.