我正在使用向用戶顯示3D呈現數據的自定義控件。該控件具有一個ResetView()方法,該方法將控件的狀態返回到其默認值。我有一個視圖模型,它是窗口的數據上下文,所以當在同一視圖中單擊按鈕並維護MVVM結構時,如何調用控件的ResetView方法?如何通過WPF中的命令調用自定義控件的方法
-1
A
回答
0
一種可能的方法,我通常使用:
在您的視圖模型創建類型的IObservable的屬性。您可以使用 作爲實際的 實現使用來自反應性擴展(RX)的主題。
public class ViewModel
{
private Subject<Unit> _resetRequest = new Subject<Unit>();
public IObservable<Unit> ResetRequest
{
get { return _resetRequest; }
}
}
爲控件創建一個行爲。行爲必須綁定到您的財產並訂閱observable。從訂閱OnNext處理程序中調用您的 控件的ResetView()方法。
public class ResetViewBehavior : Behavior<YourControl>
{
private IDisposable _subscription;
public static readonly DependencyProperty RequestProperty = DependencyProperty.Register("Request", typeof(IObservable<Unit>), typeof(ResetViewBehavior), new PropertyMetadata(null, OnRequestChanged));
public IObservable<Unit> Request
{
get { return (IObservable<Unit>)GetValue(RequestProperty); }
set { SetValue(RequestProperty, value); }
}
private static void OnRequestChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ResetViewBehavior)d).Resubscribe();
}
private void Resubscribe()
{
_subscription?.Dispose();
_subscription = Request?.Subscribe(_ => AssociatedObject.ResetView());
}
protected override void OnAttached()
{
Resubscribe();
}
protected override void OnDetaching()
{
_subscription?.Dispose();
}
}
在XAML:
<Window>
<YourControl>
<i:Interaction.Behaviors>
<b:ResetViewBehavior Request="{Binding ResetRequest}" />
</i:Interaction.Behaviors>
</YourControl>
</Window>
當你想重置視圖從調用視圖模型拍攝對象的OnNext方法。
public class ViewModel
{
private Subject<Unit> _resetRequest = new Subject<Unit>();
public IObservable<Unit> ResetRequest
{
get { return _resetRequest; }
}
private void ResetView()
{
_resetRequest.OnNext(new Unit());
}
}
使用這種方法,您沒有背後的代碼,我個人總是試圖在MVVM中避免這種情況。相反,你會在可重用行爲中包含你的邏輯。
如果您使用其他類而不是Unit作爲IObservable參數,還可以將一些數據傳遞給控件的方法。
+0
非常感謝,我會看看實施它。 – user3519506
相關問題
- 1. WPF命令自定義用戶控件
- 2. WPF命令和自定義控件
- 3. 調用命令中的自定義用戶控件
- 4. wpf中的自定義命令綁定
- 5. 向按鈕綁定的自定義控件添加命令wpf
- 6. 將自定義WPF控件中的事件綁定到ViewModel中的命令
- 7. wpf中的自定義命令
- 8. 通過導航控制器調用自定義加載方法
- 9. 如何從Angular 2中的自定義指令調用方法?
- 10. WPF自定義控件 - 你如何測試自定義控件?
- 11. wpf命令自定義控件綁定xaml
- 12. 自定義控件wpf,支持調用控件方法來支持MVVM模式
- 13. 使用WPF中的命令實現自定義CanExecuteChanged事件
- 14. wpf上的自定義命令
- 15. 自定義控件自定義方法?
- 16. 如何填充WPF自定義控件中的集合控件?
- 17. 如何通過C#代碼更改自定義WPF控件中的BitmapEffect
- 18. 如何將調用方法添加到自定義控件?
- 19. 調用自定義控制器方法
- 20. 如何實現自定義WPF控件
- 21. WPF控件的StackPanel命令
- 22. WPF中的自定義控件
- 23. WPF中的Winform自定義控件
- 24. 何時通過WPF中的命令使用事件?
- 25. 從嵌入WPF的Winforms控件調用WPF命令
- 26. 單元測試通過自定義路由調用的控制器方法
- 27. 反正有沒有通過wpf中的viewmodel來調用命令?
- 28. 無法傳遞/綁定到WPF用戶控件的命令
- 29. 如何在Windows命令行中通過WSL調用Linux命令?
- 30. WPF自定義控件TemplateBinding
'button.Click'和'control.ResetView()'根本不涉及虛擬機。你可以在代碼後面的Click處理程序中執行'control.ResetView()',因爲它是內部視圖操作。 – ASh
第二個想法,如果控制綁定到虛擬機,Vm可能應該有'Reset'方法並暴露'ResetCommand'爲button.Command綁定 – ASh
是啊我知道按鈕點擊是非MVVM,點擊我的意思該命令綁定到按鈕 – user3519506