سؤال

ويمكن كيف يمكنني تعيين DataContext على الشبكة بلدي في XAML، بدلا من منشئ؟

وهنا هو كيف أفعل ذلك في منشئ (LayoutRoot هو الشبكة XAML المحددة في XAML):

this.LayoutRoot.DataContext = this.HPVM;

وأنا أفضل أن تفعل ذلك الحق في XAML، لكني لا أعرف كيفية الرجوع الكائن HPVM في XAML. HPVM هو الممتلكات العامة على فئة UserControl.

وأنه يعمل بشكل جيد كما هو موضح أعلاه، ولكن مرة أخرى، أنا فقط أريد أن أعرف كيفية خصائص فئة UserControl في XAML، بدلا من الاضطرار دائما للقيام بذلك في التعليمات البرمجية.

وهنا كافة التعليمات البرمجية ذات الصلة:

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

وكل شيء يعمل بشكل جيد، ولكن أريد فقط أن نتعلم كيفية تعيين DataContext في XAML، وليس في التعليمات البرمجية.

هل كانت مفيدة؟

المحلول

والجواب كريس أعطى يعمل على ما يرام. لقد اختبرت وعملت بالنسبة لي. يمكنك مثيل صفك في XAML (داخل UserControl.Resources) و ثم ربط datacontext إلى مورد ثابت.

وكود التالي:


<UserControl ...>
    <UserControl.Resources>
       <myNS:MyClass x:Name="TheContext" x:Key="TheContext"></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>

في سيلفرلايت 4، وكنت قادرا على الحصول على هذا العمل عن طريق القيام بما يلي:

وتعطي ل / UserControl وس: اسم = "صفحتي"

في مراقبة استخدام ملزمة العادي تركيب bidning العنصر الخاص بك. في حالتي أنا أريد أن ربط مجموعة ملاحظتها من الكائنات في قانون بلدي وراء لملكيتي ItemsSource:

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

ولم أحاول هذا مع DataContext ولكن أعلم أنك تستطيع أن تفعل عنصر إلى عنصر ملزمة لDataContext كما أفعل هذا لشبكات التي تعتمد على العنصر المحدد من بعض الانخفاض الآخر لأسفل على الصفحة السياق.

وهذا غير ممكن (ومن الممكن في WPF مع {Binding RelativeSource={RelativeSource Self}}، ولكن سيلفرلايت هو أكثر محدودية.

وعليك أن تفعل ذلك من خلال التعليمات البرمجية.

<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top