2015-06-27 34 views
1

我有一個叫做ViewModel的類實現了INotifyPropertyChanged接口。在我的XAML我有3個文本框有符合我的ViewModel性質綁定屬性:如何在WPF中正確綁定我的模型?

TestsOrdered TestsCompleted TestsRemaining

我在我的代碼隱藏一個PropertyChanged事件處理程序。我有一個連接到XAML窗口的上下文「MyContext」。我不確定爲什麼在更改TestsOrdered和TestsCompleted值時UI不更新。我希望UI在我從文本框中跳出時進行更新,但直到我從TestsRemaining文本框中退出爲止。我設計中的缺陷在哪裏?

public partial class MainWindow : Window 
{ 
    public ViewModel vm; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     vm = new ViewModel(); 
     //ct = new CompletionTime(); 
     //ct.TestsOrdered = 8000; 

     vm.Name = "John Doe"; 
     vm.TestsCompleted = 0; 
     vm.TestsOrdered = 0; 
     vm.TestsRemaining = 0; 

     this.MyContext.DataContext = vm; 
    } 

    private void btnName_Click(object sender, RoutedEventArgs e) 
    { 
     vm.Name = "Joe"; 
    } 
} 

public class ViewModel : INotifyPropertyChanged 
{ 
    private string name; 
    private int mTestsOrdered; 
    private int mTestsRemaining; 
    private int mTestsCompleted; 

    public string Name 
    { 
     get { name; } 
     set 
     { 
      if (name != value) 
      { 
       name = value; 
       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
       } 
      } 
     } 
    } 


    public int TestsOrdered 
    { 
     get { return mTestsOrdered; } 
     set 
     { 
      if (mTestsOrdered != value) 
      { 
       mTestsOrdered = value; 
       PropertyChanged(this, new PropertyChangedEventArgs("TestsOrdered")); 
      } 
     } 
    } 


    public int TestsCompleted 
    { 
     get { return mTestsCompleted; } 
     set 
     { 
      if (mTestsCompleted != value) 
      { 
       mTestsCompleted = value; 
       PropertyChanged(this, new PropertyChangedEventArgs("TestsCompleted")); 
      } 
     } 
    } 


    public int TestsRemaining 
    { 
     get { return TestsOrdered - TestsCompleted; } 
     set 
     { 
      if (mTestsRemaining != value) 
      { 
       mTestsRemaining = value; 
       PropertyChanged(this, new PropertyChangedEventArgs("TestsRemaining")); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

MyContext是包含ViewModel對象的DataContext。

XAML:

<Grid Margin="-1,-9,1,9"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="244*"/> 
      <ColumnDefinition Width="251*"/> 
     </Grid.ColumnDefinitions> 
     <TextBox Width="100" HorizontalAlignment="Center" Margin="96.791,40,54,0" TextWrapping="Wrap" Text="{Binding Path=Name}" VerticalAlignment="Top" Grid.Column="1"/> 

     <Button x:Name="btnName" Content="Button" HorizontalAlignment="Left" Margin="171,210,0,0" VerticalAlignment="Top" Width="148" Height="47" Click="btnName_Click" Grid.ColumnSpan="2"/> 
     <TextBox Grid.Column="0" HorizontalAlignment="Left" Height="23" Margin="97,84,0,0" TextWrapping="Wrap" Text="{Binding Path=TestsOrdered}" VerticalAlignment="Top" Width="120"/> 
     <TextBox Grid.Column="0" HorizontalAlignment="Left" Height="23" Margin="97,112,0,0" TextWrapping="Wrap" Text="{Binding Path=TestsCompleted}" VerticalAlignment="Top" Width="120"/> 
     <TextBox Grid.Column="0" HorizontalAlignment="Left" Height="23" Margin="97,140,0,0" TextWrapping="Wrap" Text="{Binding Path=TestsRemaining}" VerticalAlignment="Top" Width="120"/> 

    </Grid> 
+1

您能否提供一個代碼示例,說明何時綁定xaml中的屬性? – Anders

+1

另外,什麼是'MyContext'? – Anders

+0

嗨Nautilous。我已經添加了一些XAML。我覺得我在XAML中分配綁定路徑,WPF負責幕後的其他部分。我錯過了什麼? –

回答

1

您的綁定和你的屬性是否正確寫入。然而,問題出在您將視圖模型實例分配到Window。您需要在屬性DataContext上設置視圖模型的實例,以使綁定生效。像這樣:

public MainWindow() 
{ 
    InitializeComponent(); 
    vm = new ViewModel(); 
    //ct = new CompletionTime(); 
    //ct.TestsOrdered = 8000; 

    vm.Name = "John Doe"; 
    vm.TestsCompleted = 0; 
    vm.TestsOrdered = 0; 
    vm.TestsRemaining = 0; 

    //this.MyContext.DataContext = vm; 
    this.DataContext = vm; // <-- Like so 
} 

原因是綁定工作的方式。如果未提供其他源(Source,RelativeSourceElementName屬性Binding),則綁定將使用FrameworkElementDataContext屬性分配給它們。在你的情況下,TextBox

當您設置窗口的DataContext屬性時,它的所有子對象都會繼承該對象實例及其子對象等等。

嘗試更改您的ViewModel作業,您將看到綁定工作。

//乾杯

+0

嗨,小心。我改變了它,因爲你已經提到。奇怪的是,它仍然不計算/綁定,直到我退出最後一個文本框。我仍然錯過了一些東西。 –

+0

好的。我明白了什麼是錯的。我期待模型中的所有屬性都可以更新。我想我應該把EventArgs的name屬性留空。 –

+0

好吧,綁定現在有一個連接到屬性。新問題是它的更新方式。更改綁定以包含此:'UpdateSourceTrigger = PropertyChanged'。文本框的默認值是「LostFocus」。 – Anders

相關問題