2012-04-21 63 views
2

我顯然不明白這個地方。wpf usercontrol在應用程序中的多個地方使用暴露的命令

我已經創建了一個用戶控件,梗概這就是:

private readonly DependencyProperty SaveCommandProperty = 
     DependencyProperty.Register("SaveCommand", typeof(ICommand), 
            typeof(ctlToolbarEdit)); 

private readonly DependencyProperty IsSaveEnabledProperty = 
     DependencyProperty.Register("IsSaveEnabled", typeof(bool), 
     typeof(ctlToolbarEdit), new PropertyMetadata(
      new PropertyChangedCallback(OnIsSaveEnabledChanged))); 

public ctlToolbarEdit() 
{ 
    InitializeComponent(); 
} 

public bool IsSaveEnabled 
{ 
    get { return (bool)GetValue(IsSaveEnabledProperty); } 
    set { SetValue(IsSaveEnabledProperty, value); } 
} 

public static void OnIsSaveEnabledChanged(DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
{ 
    ((ctlToolbarEdit)d).cmdSave.IsEnabled = (bool)e.NewValue; 
} 

#region Command Handlers 
public ICommand SaveCommand 
{ 
    get { return (ICommand)GetValue(SaveCommandProperty); } 
    set { SetValue(SaveCommandProperty, value); } 
} 

private void cmdSave_Click(object sender, RoutedEventArgs e) 
{ 
    if (SaveCommand != null) 
     SaveCommand.Execute(null); 
} 

#endregion 

優秀。你可以看到我在做什麼......處理按鈕的點擊事件,並基本上啓動命令。

形式(允許調用Form1中暫且......但是請注意,這實際上是一個用戶控件:常見的做法,我相信,在MVVM)承載控制具有以下行:

<ctl:ctlToolbarEdit HorizontalAlignment="Right" Grid.Row="1" 
    SaveCommand="{Binding Save}" IsSaveEnabled="{Binding IsValid}" /> 

這很好。我有一個ICommand的視圖模型稱爲「保存」視圖模型正確呈現的IsValid財產。

到目前爲止非常好。

現在我想有我新的用戶控件也Form2上(這也是一個用戶控件 - 常見的做法,我相信,在MVVM)。碰巧,Form1和Form2同時在屏幕上。

它編譯,但我得到一個運行時異常:

「SaveCommand」屬性已經由「ctlToolbarEdit」」

...註冊導致我相信,我不噸得到「命令」可言。

爲什麼我不能在多個地方使用我的用戶?

如果我不能,你會認爲是肛有沒有辦法做到這一點?

很沮喪!

感謝您的任何幫助。

回答

4

嘗試使你的依賴屬性的靜態。否則,每次實例化新控件時都會重新註冊。您對MVVM命令的使用看起來很不錯,否則聽起來您對它很有把握。

+0

完美,配偶 - 工作。非常感謝。我希望你對我對命令的理解的信心不會錯位! – Gray 2012-04-21 13:17:43

相關問題