2009-03-20 12 views
43

Jak uzyskać dostęp do publicznej zmiennej, która znajduje się w pliku Sample.xaml.cs, np. Asp.net <% = VariableName%>?Dostępna zmienna kodu w XAML

+0

[To pytanie może być również pomocne] (http://stackoverflow.com/questions/1481130/wpf-binding-to-local-variable), ponieważ jest nieco nowsza ... – Brendan

Odpowiedz

60

Istnieje kilka sposobów, aby to zrobić.

  • Dodaj swoją zmienną jako zasób z kodzie:

    myWindow.Resources.Add("myResourceKey", myVariable); 
    

    Następnie można uzyskać do niego dostęp z XAML:

    <TextBlock Text="{StaticResource myResourceKey}"/> 
    

    Jeśli trzeba je dodać po XAML zostanie przeanalizowany, możesz użyć powyższego DynamicResource zamiast StaticResource.

  • Ustaw zmienną właściwość czegoś w swoim XAML. Zwykle działa przez DataContext:

    myWindow.DataContext = myVariable; 
    

    lub

    myWindow.MyProperty = myVariable; 
    

    Po tym, coś w XAML można uzyskać do niego dostęp za pośrednictwem Binding:

    <TextBlock Text="{Binding Path=PropertyOfMyVariable}"/> 
    

    lub

    <TextBlock Text="{Binding ElementName=myWindow, Path=MyProperty}"/> 
    
9

Dla szybkich i brudnych okien w WPF, wolę wiązać DataContext okna z samym oknem; to wszystko można zrobić w XAML.

Window1.xaml

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding RelativeSource={RelativeSource self}}" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <TextBlock Text="{Binding Path=MyProperty1}" /> 
     <TextBlock Text="{Binding Path=MyProperty2}" /> 
     <Button Content="Set Property Values" Click="Button_Click" /> 
    </StackPanel> 
</Window> 

Window1.xaml.cs

public partial class Window1 : Window 
{ 
    public static readonly DependencyProperty MyProperty2Property = 
     DependencyProperty.Register("MyProperty2", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty)); 

    public static readonly DependencyProperty MyProperty1Property = 
     DependencyProperty.Register("MyProperty1", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty)); 

    public Window1() 
    { 
     InitializeComponent(); 
    } 

    public string MyProperty1 
    { 
     get { return (string)GetValue(MyProperty1Property); } 
     set { SetValue(MyProperty1Property, value); } 
    } 

    public string MyProperty2 
    { 
     get { return (string)GetValue(MyProperty2Property); } 
     set { SetValue(MyProperty2Property, value); } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     // Set MyProperty1 and 2 
     this.MyProperty1 = "Hello"; 
     this.MyProperty2 = "World"; 
    } 
} 

W powyższym przykładzie, zauważ wiązanie stosowany w nieruchomości DataContext w oknie, to mówi " Skonfiguruj kontekst danych dla siebie ". Dwa bloki tekstu są powiązane z MyProperty1 i MyProperty2, procedura obsługi zdarzenia dla przycisku ustawi te wartości, które będą automatycznie propagować do właściwości TextBlocks, ponieważ właściwości są Właściwościami zależności.

23

do wiązania, jeśli DataContext nie jest używany, można po prostu dodać do konstruktora kodu tyle:

this.DataContext = this; 

Używanie tego, każda nieruchomość w kodzie staje się dostępny dla wiązania:

<TextBlock Text="{Binding PropertyName}"/> 

Innym sposobem jest po prostu nadać nazwę elementu głównego XAML:

x:Name="root" 

Ponieważ XAML jest skompilowany jako częściowe klasy opóźnieniem kodu, możemy uzyskać dostęp do każdej nieruchomości według nazwy:

<TextBlock Text="{Binding ElementName="root" Path=PropertyName}"/> 

Uwaga: dostęp jest możliwy tylko do właściwości; nie na pola. i get; lub {Binding Mode = OneWay} są konieczne. Jeśli używane jest wiązanie OneWay, dane podstawowe powinny implementować INotifyPropertyChanged.

+1

Dzięki! Ta odpowiedź pomogła mi. Nie mogłem użyć metody DataContext, ponieważ tworzę formant użytkownika, a jeśli ustawię kontekst danych w ramach mojej kontroli, to moja kontrola nie będzie w stanie uzyskać datakekstu jego rodziców, kiedy używam go w aplikacjach. Wiązanie bezpośrednio z korzeniami dało mi ten sam rezultat, którego szukałem, i pozostawiło kontekst danych kontrolnych nietknięty. –

+1

"{Binding PropertyName}" działa tylko na własności publicznej. – Duc

+0

Dzięki za porady "root". Działa, mimo że właściwości kodu z tyłu nie są wymienione w projektowaniu powiązań wizualnych, co jest nieco mylące. –

3

Warto również zauważyć, że "wiązanie" można ustawić tylko na DependencyProperty obiektu zależnego. Jeśli chcesz ustawić właściwość non DependencyProperty (np. Normalną właściwość) na obiekcie w XAML, będziesz musiał użyć pierwszej metody Roberta wykorzystania zasobów w kodzie.