Silverlight - настройка DataContext в XAML, а не в конструкторе?
Как я могу установить 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, а не в коде.
Ответы
Ответ 1
Ответ Крис прекрасно дал работы.
Я проверил, и это сработало для меня.
Вы можете создать экземпляр класса в 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>
Ответ 2
В Silverlight 4
работает следующее чудовище:
<UserControl
DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
Ответ 3
<UserControl.DataContext>
<vm:ThisUCViewModel />
</UserControl.DataContext>
Ответ 4
попробуй что-нибудь вроде этого.....
<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>
Ответ 5
В Silverlight 4 мне удалось получить эту работу, выполнив следующие действия:
Дайте странице /UserControl x: Name= "myPage"
В вашей привязке привязки используется обычный синтаксис для упрощения элемента. В моем случае я хочу привязать к наблюдаемому набору объектов в моем коде для моего свойства ItemsSource:
<ComboBox
ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay}
Я не пробовал это с помощью DataContext, но знаю, что вы можете привязать элемент к элементу для DataContext, как я делаю это для Grids, контекст которого основан на выбранном элементе другого выпадающего списка.
Ответ 6
Это невозможно (возможно в WPF с {Binding RelativeSource={RelativeSource Self}}
, но Silverlight более ограничен.
Вы должны сделать это с помощью кода.
Ответ 7
<UserControl.Resources>
<ResourceDictionary>
<vm:YourModelx:Key="myModel"/>
</ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>