2013-01-07 29 views
6

我很好奇,因爲我正在學習有關WPF綁定的更多信息,您是否需要將數據上下文設置爲簡單地設置單個屬性的{binding path =}?我只是好奇,因爲我從背後的MVVM代碼示例中學習,看起來我有一種情況,我想綁定到不在ViewModel的數據上下文中的東西,我更喜歡中間類,而不是代碼後面,以便在捆綁。那麼我可以有另一個我引用第二個數據上下文或類似的類嗎?或者我可以設置資源鍵並以某種方式引用該類?如果可能的話,我最終想要在一個單獨的類中訪問一個屬性。將屬性從類直接綁定到XAML

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> 

我知道我可以在代碼中設置一個文本框的背後的價值和它的屬性的例子的作品,但它不會綁定。有沒有辦法做到簡單的綁定動態從類的屬性?我還沒有找到一個簡單的例子,這是一個簡單的例子,我正在網上搜索,而在學習綁定時,大多數例子都是非常強烈的設置數據上下文集或非常簡單的靜態資源例子。我只是好奇你是否可以使用{Binding Path =}並擴展一些其他屬性以便在類中獲取代碼。

休息的代碼非常簡單:

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

回答

9

您可以設置的DataContext在XAML這樣的:

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

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

這正是我一直在尋找。我知道有一個簡單的方法來擴展我缺少的XAML中的名稱空間。 – djangojazz

+0

@ kusi581,你也解決了我的問題。 –

5

數據上下文未設置。 DataBinding不知道從哪裏獲取TestID。下面是正確的代碼背後:

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

幾點需要注意:

  • TestID您要綁定的屬性只讀,因爲它只有 有get-accessor。因此,綁定應該只有OneWay
  • 指定DataContext:您可以將保存模型的實例分配給ICollection <BaseViewModel>屬性(可能包含集合中的所有派生實例)或直接指定模型本身(如您的情況)。正如我在下面的代碼中所做的那樣。

代碼

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" /> 

欲瞭解更多請參考:

+0

偉大的觀點,對於我的例子,我並不擔心必須將「set」方法添加到我的資產中,但有時這很重要。感謝您在模式中添加信息。我曾看過你給出的兩個第一鏈接,但是你給的DataContext上的兩個鏈接都非常好。 – djangojazz