문제

생성자가 아닌 XAML의 그리드에서 데이터 콘텍스트를 어떻게 설정하려면?

생성자에서 수행하는 방법은 다음과 같습니다 (Layoutroot는 XAML에 정의 된 XAML 그리드) :

this.LayoutRoot.DataContext = this.HPVM;

XAML에서 바로 수행하는 것을 선호하지만 XAML에서 HPVM 객체를 참조하는 방법을 모르겠습니다. HPVM은 USERCONTROL 클래스의 공공 재산입니다.

위에 나열된대로 잘 작동하지만 다시 말하지만, 항상 코드로 수행하지 않고 XAML에서 USERCONTROL 클래스의 속성을 알고 싶습니다.

다음은 모든 관련 코드입니다.

  <UserControl x:Class="SilverlightApplication1.SLHolePattern" x:Name="HolePatternsControl"
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"    
    xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls"
    xmlns:local="clr-namespace:SilverlightApplication1"    
    xmlns:GeoPatterns="clr-namespace:GeoPatterns"
    Height="700">


    <UserControl.Resources>
    ...

그리고 다음은 DataContext가 현재 설정된 제작자입니다.

namespace SilverlightApplication1
{
    public partial class SLHolePattern : UserControl, INotifyPropertyChanged
    {
        public HolePatternsViewModel HPVM;

        public SLHolePattern()
        {
            InitializeComponent();

            this.HPVM=new HolePatternsViewModel();
            this.LayoutRoot.DataContext = this.HPVM;
            ...more code here
        }

모두 잘 작동하지만 코드가 아닌 XAML에서 데이터 콘텍스트를 설정하는 방법을 배우고 싶습니다.

도움이 되었습니까?

해결책

Chris가 주신 답변은 잘 작동했습니다. 나는 테스트를 거쳤고 그것은 나를 위해 일했다. XAML (USERCONTROL.RESOURCES 내)에서 클래스를 인스턴스화 한 다음 데이터 콘텍스트를 정적 리소스에 바인딩 할 수 있습니다.

코드 팔로우 :


<UserControl ...>
    <UserControl.Resources>
       u003CmyNS:MyClass x:Name="TheContext" x:Key="TheContext">u003C/myNS:MyClass>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White" DataConText = "{staticResource theContext}" >
        <TextBlock Text="{Binding Path=Field1}">
        </TextBlock>
    </Grid>
</UserControl>

다른 팁

다음의 괴물은 Silverlight 4에서 작동합니다

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>

이렇게 시도해보세요 .....

<Grid DataContext="{Binding Path=HPVM}">
</Grid>

여기서 HPVM은 이것의 공개 구성원입니다-> 귀하의 양식 등.

리소스 섹션에 이와 같은 것을 추가하여 XAML에서 클래스 인스턴스를 만듭니다 ... (XMLNS 네임 스페이스 추가를 잊지 마십시오)

<my:bogart x:Key="franken"/>

그런 다음 데이터 컨텍스트를 방금 추가 한 정적 리소스에 바인딩합니다 ....

<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource franken}">
    <TextBox  Background="Red" Foreground="White" Text="{Binding Path=sum}"  />
</Grid>

Silverlight 4에서는 다음을 수행 하여이 작업을 수행 할 수있었습니다.

페이지/usercontrol 및 x : name = "mypage"를 제공하십시오.

제어 바인딩에서 정상 요소 입찰 구문을 사용하십시오. 제 경우에는 ItemsSource 속성에 대한 내 코드의 관찰 가능한 객체 모음에 바인딩하고 싶습니다.

<ComboBox 
    ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay}

나는 datacontext로 이것을 시도하지 않았지만 페이지에서 선택한 다른 드롭 다운의 선택된 항목을 기반으로하는 그리드에 대해 이것을 할 때 Datacontext의 요소 바인딩 요소를 수행 할 수 있다는 것을 알고 있습니다.

이것은 불가능합니다 (WPF에서는 가능합니다. {Binding RelativeSource={RelativeSource Self}}, 그러나 Silverlight는 더 제한적입니다.

코드를 통해해야합니다.

<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top