2012-08-23 58 views
2

時間爲我的第一個問題:)同時使用MVVM

WPF綁定問題,我有以下:

public class BuilderViewModel : INotifyPropertyChanged 
{ 
    #region Implementation of INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 

    private double _contentScale = 1.0; 

    public double ContentScale 
    { 
     get { return _contentScale; } 
     set 
     { 
      _contentScale = value; 
      NotifyPropertyChanged("ContentScale"); 
     } 
    } 

    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #region Commands 

    bool CanZoomIn() { return true; } 
    void ZoomInExecute() 
    { 
     ContentScale += 1.0; 
    } 

    public ICommand ZoomIn { get { return new RelayCommand(ZoomInExecute, CanZoomIn); } } 

    #endregion 
} 

以及相應的視圖:

<UserControl x:Class="PS_IDE.FormBuilder.View.Builder" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:PS_IDE.FormBuilder.ViewModel"> 
    <UserControl.DataContext> 
     <local:BuilderViewModel /> 
    </UserControl.DataContext> 

    <TextBox Text="{Binding ContentScale}" Width="100" /> 

</UserControl> 

我想有BuilderViewModel中的ZoomIn命令更新其視圖中的文本框值。該命令是從另一個用戶控件UIBuilder(包含Builder)觸發的。如果我從UIBuilder調試並激活命令,我可以看到它正確更新ContentScale。

但是,我的文本框的值沒有得到更新(它只是表示「1」,它是ContentScale的初始值)。

我知道我錯過了一些東西,並希望有人能指出我在正確的方向。

編輯:添加的是在激發命令

<UserControl x:Class="PS_IDE.FormBuilder.UIBuilder" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:PS_IDE.FormBuilder" 
     xmlns:ViewModel="clr-namespace:PS_IDE.FormBuilder.ViewModel" 
     xmlns:View="clr-namespace:PS_IDE.FormBuilder.View" mc:Ignorable="d"> 
    <UserControl.DataContext> 
     <ViewModel:BuilderViewModel /> 
    </UserControl.DataContext> 
    <DockPanel LastChildFill="True"> 

     .... 

     <ToolBarTray DockPanel.Dock="Bottom" HorizontalAlignment="Right"> 
      <ToolBar> 
       <Button Height="24" Width="24" ToolTip="Zoom In" Command="{Binding ZoomIn}"> 
        <Image Source="Images/ZoomIn.png" Height="16"/> 
       </Button> 

       .... 

      </ToolBar> 
     </ToolBarTray> 
     <View:Builder x:Name="builder" /> 
    </DockPanel> 
</UserControl> 
+0

你能告訴我們這觸發了'ZoomIn'命令的控制? – nemesv

+0

我將其添加到原始帖子的末尾:) – Ikofai

+0

只是爲了它的地獄,它是否工作,如果你做ContentScale = ContenScale + 1.0;而不是ContentScale + = 1.0; ?你確定你在兩個視圖中使用了與你的datacontext相同的BuilderViewModel實例嗎? – Thelonias

回答

1

在設置在兩個視圖

<UserControl.DataContext> 
    <local:BuilderViewModel /> 
</UserControl.DataContext> 

你基本上是創建兩個viewmodels,每個視圖一個。所以當你的Command更新屬性時,它會在視圖模型中的一個上執行,但是你的文本框綁定到不同的視圖模型。

要解決它Builder.xaml

刪除DataContext設置另外,你需要通過你的DataContextBuilder控制(此兩個視圖將共享相同的視圖模型)。

所以修改UIBuilder.xaml:

<View:Builder x:Name="builder" DataContext="{Binding}" /> 
+0

好的,這是完全合理的。我知道我錯過了一些東西。我的所有問題都已解決,非常感謝您的幫助! – Ikofai

0

使用模式雙向你綁定

Text ="{Binding ElementName=BuilderViewModel, 
     Path=ContentScale, 
     Mode=TwoWay, 
     UpdateSourceTrigger=PropertyChanged}" 

諾塔控制:使用觀察的集合,以發送通知

+0

模式TwoWay是WPF TextBox.Text中的默認值,無論如何OP在另一個方向上存在問題,即viewmodel中的更改未反映在視圖中。 – nemesv

+0

我已經試過TwoWay。我只需要一種方式,因爲當ViewModel更新時,視圖反映了這一點。 – Ikofai

+0

添加可觀察的集合,以便發送通知來查看 –