2013-01-07 12 views
6

Byłem ciekawy, jak nauczyłem się więcej na temat wiązania z WPF, czy trzeba ustawić kontekst danych, aby po prostu ustawić {ścieżkę wiążącą =} jednej właściwości? Byłem po prostu ciekawy, ponieważ uczyłem się z przykładu kodu MVVM z tyłu i wydaje mi się, że mam sytuację, którą chcę powiązać z czymś, co nie jest w kontekście danych ViewModel i wolałbym klasę pośrednią niż kod za referencją w wiążący. Czy mógłbym mieć kolejną referencję klasy I dla drugiego datakonteksu lub czegoś podobnego? Czy mogę ustawić klucz zasobów i jakoś odwołać się do klasy? Ostatecznie chcę, jeśli to możliwe, uzyskać dostęp do właściwości w oddzielnej klasie.Wiązanie właściwości z klasy do XAML bezpośrednio

EG:

<Window x:Class="WPFTestBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:da="clr-namespace:WPFTestBinding.DataAccess" 
     xmlns:main="clr-namespace:WPFTestBinding" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel> 
      <Label Content="Here we go: "/> 
      <TextBox x:Name="testtext" /> 
      <Label Height="50" /> 
      <!-- CODE BELOW WILL NOT WORK --> 
      <TextBox Text="{Binding Path=TestID}" x:Name="testtext2" /> 
     </StackPanel> 
    </Grid> 
</Window> 

wiem, że mogę ustawić wartość TextBox w kodzie tyłu i to działa na przykładzie właściwość, ale nie będzie za wiązanie. Czy istnieje sposób na proste wiązanie w locie dla właściwości z klas? Nie znalazłem prostego przykładu, który to robi i szukałem w Internecie, a podczas uczenia się większość przykładów to bardzo intensywne zestawy ustawień kontekstów danych lub bardzo proste statyczne przykłady zasobów. Byłem po prostu ciekawy, czy mógłbyś użyć {Binding Path =} i rozszerzyć jakąś inną właściwość w locie, aby uzyskać kod na zajęciach.

Reszta kodu jest dość prosta:

namespace WPFTestBinding.DataAccess 
{ 
    class Test 
    { 
     public string TestID { get { return "This is my test"; } } 
    } 
} 

public partial class MainWindow : Window 
    {  
     public MainWindow() 
     { 
      InitializeComponent(); 

      DataAccess.Test t = new Test(); 

      testtext.Text = t.TestID; // code behind works easily 
     } 
    } 

Odpowiedz

9

Można ustawić DataContext w XAML tak:

<Window xmlns:da="clr-namespace:WPFTestBinding.DataAccess"> 
    <Window.DataContext> 
     <da:Test/> 
    <Window.DataContext> 

    <TextBox Text="{Binding TestID}"/> 
</Window> 
+0

To jest dokładnie to, czego szukałem. Wiedziałem, że istnieje prosta metoda rozszerzenia przestrzeni nazw w XAML, którego mi brakowało. – djangojazz

+0

@ kusi581, Ty też rozwiązujesz mój problem. –

5

kontekstu danych nie jest ustawiona. DataBinding nie wie, skąd wziąć TestID od. Oto prawidłowy kod za:

namespace WPFTestBinding.DataAccess 
{ 
    class Test 
    { 
     public string TestID { get { return "This is my test"; } } 
    } 
} 

public partial class MainWindow : Window 
{  
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataAccess.Test t = new Test(); 

     DataContext = t;   
    } 
} 
7

Niektóre punkty do uwaga:

  • Nieruchomość TestID próbujesz powiązać jest tylko do odczytu, ponieważ tylko ma get-accessor. Dlatego oprawa powinna być tylko OneWay.
  • Przypisanie DataContext: Można przypisać instancję przechowującą model, taki jak MainViewModel z właściwością ICollection <BaseViewModel> (który będzie miał wszystkie pochodne instancje w kolekcji) lub bezpośrednio sam model (jak w twoim przypadku). Tak jak zrobiłem w poniższym kodzie.

Kod

namespace WPFTestBinding.DataAccess 
{ 
    class Test 
    { 
     public string TestID { get { return "This is my test"; } } 
    } 
} 

public partial class MainWindow : Window 
{  
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataAccess.Test testInstance = new Test(); 
     this.DataContext = testInstance; 
    } 
} 

XAML

<TextBox Text="{Binding Path=TestID, Mode=OneWay}" x:Name="txtTestID" /> 

Więcej patrz:

+0

Świetne punkty, na przykład nie martwiłem się koniecznością dodawania metody "zestawu" do mojej własności, ale czasami będzie to miało znaczenie. Dziękujemy za dodanie informacji o trybie. Przyjrzałem się dwóm pierwszym liniom, które podałeś wcześniej, ale dwa linki do danych, które podałeś, są bardzo dobre. – djangojazz

Powiązane problemy