2016-07-06 37 views
4
Custom_View.xaml 

    <UserControl> 
     <local:Custom_Text_Field 
      Custom_Text_Field_Color="{x:Bind ViewModel.Color1 , Mode=TwoWay}"> 
     </local:Custom_Text_Field> 
     <local:Custom_Text_Field 
      Custom_Text_Field_Color="{x:Bind ViewModel.Color2 , Mode=TwoWay}"> 
     </local:Custom_Text_Field> 
     <Button Click="{x:Bind ViewModel.ChangeColor"/> 
    </UserControl> 

Custom_View.cs 

    public sealed partial class Custom_View : UserControl 
    { 
     public Custom_View_VM ViewModel { get; set; } 
     public Custom_View() 
     { 
      ViewModel = new Custom_View_VM(); 
      this.InitializeComponent(); 
     } 
    } 

Custom_View_VM.cs 

    public class Custom_View_VM : NotificationBase 
    { 
     public Brush Color1 { get; set; } 
     public Brush Color2 { get; set; } 
     public void ChangeColor{//change color1 or color2}; 
    } 

數據綁定的問題,我用的NotificationBase類從這個例子:https://blogs.msdn.microsoft.com/johnshews_blog/2015/09/09/a-minimal-mvvm-uwp-app/使用NotificationBase

如果我影響在CONSTRUCTEUR爲COLOR1或COLOR2值,它的工作(更改視圖),但在通話結束後ChangeColor,View模型中的值會更改,但不會影響視圖。

+0

通常你會在代碼隱藏而不是ViewModel中創建DependencyProperties。控件的使用者可以將你控制的依賴屬性綁定到他們的ViewModel。 – markmnl

+0

感謝您的回答,我在後面的Custom_Text_Field代碼中創建了DependencyProperties,我爲我的Custom_View創建了ViewModel,因爲UI比我的例子更復雜,並且他與Web服務中的數據鏈接在一起:( – sasukaru

+0

有2個不同的這裏的綁定類型:綁定到後面的代碼(使用Dependancy Property)並綁定到ViewModel(使用INotifyPropertyChanged) - 不清楚哪一個不起作用:Border(帶有DP)或Text Fields(綁定到VM )? –

回答

3

要更新UI,應該收到PropertyChanged事件。您應該使用NotificationBase的機制來設置屬性也將提高PropertyChanged事件:

public class Custom_View_VM : NotificationBase 
{ 
    private Brush color1; 
    public Brush Color1 
    { 
     get { return color1; } 
     set { SetProperty(color1, value,() => color1 = value); } 
    } 
    // TODO: same here 
    public Brush Color2 { get; set; } 
    public void ChangeColor{//change color1 or color2}; 
} 

而且顏色不通常進入ViewModelsViewModel應具有某些業務邏輯屬性,您可以將TextBox的顏色設爲XAML,如IsNameAvailable

+0

謝謝,但得到{返回This.Color1; }拋出一個system.StackOverflowException :(我真的錯過了一些東西>< – sasukaru

+1

修正了我的例子,不要使用'This'字段'NotificationBase',這太混亂了。您可以將它重命名爲Model或其他東西 –

+0

感謝它的工作! 現在,我會跟着你,並重構我的代碼:) – sasukaru

1

您需要註冊屬性。

public static readonly DependencyProperty Custom_Text_Field_Color_Property = 
     DependencyProperty.Register("Custom_Text_Field_Color", typeof(Brush), 
     typeof(Class_Name), new UIPropertyMetadata(null)); 

     public Brush Custom_Text_Field_Color 
     { 
      get { return (Brush)GetValue(Custom_Text_Field_Color_Property); } 
      set { SetValue(Custom_Text_Field_Color_Property, value); } 
     } 

使用控制名稱(即,類名稱),用於typeof(Class_Name)

+1

感謝您的回答,但我已經註冊我的屬性在Custom_Text_Field代碼:) – sasukaru

-1

在你的案例類中NotificationBase是一個自定義類,你可以使用是否。

我只是基本上解釋了MVVM的設計模式。 在ViewModel中,它應該實現Interface INotifyPropertyChanged,並在設置屬性時觸發事件PropertyChanged。

public sealed class MainPageViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _productName; 
    public string ProductName 
    { 
     get { return _productName; } 
     set 
     { 
      _productName = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ProductName))); 
      } 
     } 
    } 
} 

下樣本將演示此MVVM設計模式。 https://code.msdn.microsoft.com/How-to-achieve-MVVM-design-2bb5a580