Silverlight- 생성자가 아닌 XAML에서 DataContext 설정?
-
03-07-2019 - |
문제
생성자가 아닌 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>