2017-04-17 27 views
0

我在我的自定義控件中有一個布爾屬性。我有一個屬性更改回調方法,其中我重新設置標誌值視圖更新屬性,即視圖將設置屬性值爲true,並在自定義控件中我正在做一些處理,並將屬性值設置爲false 。當我將自定義控件中的屬性值更新爲false時,它不會更新到視圖端。MVVM - 自動重置標誌實現

CustomControl:

public bool ResetFlag 
    { 
     get { return (bool)GetValue(ResetFlagProperty); } 
     set { SetValue(ResetFlagProperty, value); } 
    } 
public static readonly DependencyProperty ResetFlagProperty = DependencyProperty.Register("ResetFlag", typeof(bool), typeof(ExtendedTextBox), new PropertyMetadata(false, OnResetFlagChanged)); 

private static void OnResetFlagChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var extendedTextBox= d as ExtendedTextBox; 
    if (extendedTextBox== null) 
    { 
     return; 
    } 
    if ((bool)e.NewValue) 
    { 
     //Do processing here 
     extendedTextBox.ResetFlag = false; 
    } 
} 

視圖模型:

<StackPanel> 
    <local:ExtendedTextBox ResetFlag="{Binding ResetValue,Mode=TwoWay}"/> 
    <Button Content="ResetFlag" Click="Button_Click"/> 
</StackPanel> 

public bool ResetValue 
{ 
    get { return (bool)GetValue(ResetValueProperty); } 
    set { SetValue(ResetValueProperty, value); } 
} 

public static readonly DependencyProperty ResetValueProperty = DependencyProperty.Register("ResetValue", typeof(bool), typeof(MainWindow), new PropertyMetadata(false)); 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    ResetValue = true; 
} 

是否有人可以幫助我瞭解爲什麼值沒有反映在視圖模型,當我在定製控件中設置的布爾標誌爲假?

+1

沒有好的[MCVE]認爲可靠地再現你的問題,這是不可能的。但是,WPF通常在一個方向禁用綁定更新,當它處於另一個方向的更新處理過程中。目前還不清楚是什麼引導了你這個設計,但我懷疑這是管理你想要做的事情的最好方法。你應該發佈一個問題,詢問這個更廣泛的問題,而不是這個具體的實現。請參閱[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

+1

只是一個旁註:你不需要'ViewModel'中的'DependencyProperty',只是一個「正常」的「財產」。 –

+0

@PeterDuniho感謝您的建議。我會更新這個問題,否則我會在不同的線程中創建新的問題。 – swamy

回答

0

Wy是你在MainWindow類中定義另一個ResetValue屬性嗎?您應該設置ExtendedTextBox控件的ResetFlag屬性。

給控制在XAML標記的x:Name

<local:ExtendedTextBox x:Name="ctrl" ResetFlag="{Binding ResetValue,Mode=TwoWay}"/> 

...並設置控件的屬性在Button_Click事件處理程序:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    ctrl.ResetValue = true; 
} 
+0

我遵循MVVM方法我知道我已經在xaml.cs中編寫了代碼),因此該屬性在MainWindow類中聲明。 – swamy

+0

什麼?你有兩個屬性,但你設置了錯誤的屬性。你應該設置控件的屬性而不是窗口的屬性。 – mm8