2015-03-25 93 views
0

我有產權更新MVVM屬性不更新

奇怪的問題

我的模型看起來像

using GalaSoft.MvvmLight.Messaging; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using TestSome.DataType; 
using TestSome.MessageInfrastructure; 
using TestSome.WorkingWithNode; 

namespace TestSome.Model 
{ 
    class CentralModel 
    { 
     private BalanceTest someTest; 
     public BalanceTest SomeTest 
     { 
      get { return someTest; } 
      set { someTest = value; } 
     } 
     public void ListenBalance() 
     { 
      SocketHandler.Socket.Handle.Add("balance", (m) => 
      { 
       try 
       { 
        BalanceTest bt = m.Message.Json.GetFirstArgAs<BalanceTest>(); 
        SomeTest = bt; 
        Messenger.Default.Send(new BalanceCommunicator { TestBalance = bt }, "Token"); 
       } 
       catch (Exception ex) 
       { 
        System.Windows.MessageBox.Show(ex.Message.ToString()); 
       } 
      }); 
     } 
    } 
} 

我的視圖模型看起來像

public class BalanceViewModel : ViewModelBase 
{ 
    private BalanceTest some; 
    public BalanceTest Some 
    { 
     get { return some; } 
     set { some = value; RaisePropertyChanged("Some"); } 
    } 
    private CentralModel CM; 
    public BalanceViewModel() 
     { 
      try 
      { 
       CM = new CentralModel(); 
       CM.ListenBalance(); 
       Some = CM.SomeTest; 
      } 
      catch (Exception ex) 
      { 
       System.Windows.MessageBox.Show(ex.Message.ToString()); 
      } 
     } 

和XAML看起來像

<UserControl x:Class="TestSome.Views.BalanceView" 
     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:Test="clr-namespace:TestSome.Model" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<UserControl.Resources> 
    <Test:CentralModel x:Key="CentralMode"></Test:CentralModel> 
</UserControl.Resources> 
<Expander ExpandDirection="Right"> 
<StackPanel Orientation="Horizontal"> 

     <Label Content="{Binding SomeTest.Balance,Source={StaticResource CentralMode},Mode=TwoWay}"></Label> 
</StackPanel> 
</Expander> 

爲什麼不更新?

+0

你初始化了DataContext嗎? – 2015-03-25 09:45:46

+0

public BalanceView() { InitializeComponent(); DataContext = new BalanceViewModel(); } – A191919 2015-03-25 09:47:10

+0

請勿任意將文本的每一位斜體。沒用的。 – 2015-03-25 09:51:34

回答

0

我建議你實現你的CentralModel類的event和處理程序在你的BalanceViewModel,爲了交流新數據向上。

在CentralModel類:

/// <summary> 
/// Raised when a new balance is received. 
/// </summary> 
public event EventHandler<EventArgs> NewBalanceEvent; 

public void ListenBalance() 
{ 
    SocketHandler.Socket.Handle.Add("balance", (m) => 
    { 
     try 
     { 
      BalanceTest bt = m.Message.Json.GetFirstArgAs<BalanceTest>(); 
      SomeTest = bt; 
      Messenger.Default.Send(new BalanceCommunicator { TestBalance = bt }, "Token"); 

      // Raise the event 
      EventHandler<EventArgs> RaiseNewBalanceEvent = NewBalanceEvent; 
      if (null != RaiseNewBalanceEvent) 
      { 
       RaiseNewBalanceEvent(this, EventArgs.Empty); 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Windows.MessageBox.Show(ex.Message.ToString()); 
     } 
    }); 
} 

而在你BalanceViewModel類掛鉤事件:

private void NewBalanceEventHandler(Object sender, EventArgs args) 
{ 
    // This will trigger the property changed event. 
    Some = CM.SomeTest; 
} 

public BalanceViewModel() 
{ 
    try 
    { 
     CM = new CentralModel(); 
     CM.ListenBalance(); 
     Some = CM.SomeTest; 

     // Attach to the NewBalance event 
     // Note: you should detatch it again (with -=) when you've finished with it. 
     CM.NewBalanceEvent += NewBalanceEventHandler; 
    } 
    catch (Exception ex) 
    { 
     System.Windows.MessageBox.Show(ex.Message.ToString()); 
    } 
} 

現在,每當拉姆達在SocketHandler.Socket.Handle.Add被調用時,CentralModel提高了NewBalanceEvent,這依次(通過框架)調用BalanceViewModel的事件處理程序委託,並且Some屬性得到更新。

編輯

此外,this answer,由fix-likes-coding提供的是正確的:你需要綁定到View中的正確的屬性。

0

您不會在SomeTest屬性上提升RaisePropertyChanged("SomeTest")。它爲什麼會起作用? :)

+0

'SomeTest'是模型 – thumbmunkeys 2015-03-25 09:56:33

+0

我認爲這沒有幫助。我實現了NotifyPropertyChanged(「SomeTest」);什麼都沒發生。 – A191919 2015-03-25 10:12:43

+1

我喜歡做的是將綁定的每一節添加爲文本塊的綁定,以查看綁定出錯的位置。否則你也可以配置你的調試器在輸出中顯示綁定錯誤 – Dbl 2015-03-25 11:13:59

0

您需要綁定到你的BalanceViewModel的Some,而不是到CentralModel

<Label Content="{Binding Path=Some.Balance,Mode=TwoWay}"></Label> 
+0

沒有任何反應。 – A191919 2015-03-25 10:13:56

+0

1.它是否正確顯示起始值?你永遠不會改變價值。你有沒有把斷點檢查是怎麼回事? – fixagon 2015-03-25 10:36:41

+0

我認爲你是對的,它只在初始化時纔會增加。你能建議如何每次都更新這個屬性嗎?使用計時器或...?謝謝。 1.啓動值正確顯示 2.它正在改變,但用戶界面不更新。 3 /是的 – A191919 2015-03-25 10:42:44