Silverlight - Установка DataContext в XAML, а не в конструкторе? - PullRequest
30 голосов
/ 03 марта 2009

Как я могу установить DataContext в моей Grid в 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, а не в коде.

Ответы [ 7 ]

24 голосов
/ 04 марта 2009

Ответ Крис дал работы просто отлично. Я проверил, и это сработало для меня. Вы можете создать свой класс в XAML (в UserControl.Resources) и затем привяжите текстовый текст к статическому ресурсу.

Следующий код:


<UserControl ...>
    <UserControl.Resources>
       <b><myNS:MyClass x:Name="TheContext" x:Key="TheContext"></myNS:MyClass></b>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White" <b>DataContext="{StaticResource TheContext}"</b> >
        <TextBlock Text="{Binding Path=Field1}">
        </TextBlock>
    </Grid>
</UserControl>

10 голосов
/ 21 июля 2010

Следующее чудовище работает в Silverlight 4

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
6 голосов
/ 30 января 2010
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>
2 голосов
/ 03 марта 2009

попробуйте что-то вроде этого .....

<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>
1 голос
/ 20 января 2011

В Silverlight 4 я смог добиться этого, выполнив следующие действия:

Дайте странице / UserControl x: Name = "myPage"

В вашем контрольном связывании используйте нормальный синтаксис назначения элементов. В моем случае я хочу привязать к наблюдаемой коллекции объектов в моем коде для моего свойства ItemsSource:

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

Я не пробовал это с DataContext, но знаю, что вы можете сделать привязку элемента к элементу для DataContext, как я это делаю для гридов, контекст которых основан на выбранном элементе какого-либо другого выпадающего на странице.

0 голосов
/ 14 августа 2011
<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
0 голосов
/ 03 марта 2009

Это невозможно (возможно в WPF с {Binding RelativeSource={RelativeSource Self}}, но Silverlight более ограничен.

Вы должны сделать это с помощью кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...