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

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

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

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

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

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

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

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

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



답변

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}}" ...

충분히 잘 작동합니다.


답변

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

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

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


답변

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

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

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

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


답변

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

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


답변

.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
    }
}


답변

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

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

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

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


답변

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

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

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