2015-07-28 74 views
2

這個問題可能更好,但基本上,這是我想要做的:有沒有辦法動態地暴露WPF中的綁定?

我正在爲我們的應用程序,像Word這樣的基本功能,但需要一些額外的工具衛生保健。

該功能被組織成邏輯組,例如,剪輯命令(剪切複製粘貼),對齊等;並且這些以帶狀控件表示。

我們需要創建一個基於上下文的這些功能混合的編輯器實例;例如有時我們想要公開「編輯」小組,有時我們想要公開「成像」小組。因此,我不希望將每個單獨的命令分成不同的類,然後將它們分組爲每個邏輯組的視圖模型,如下所示:

class Cut: ICommand {} 
class Copy: ICommand {} 

class ClipCommands { 
    public ICommand Cut { get { return _cutCommand; } } 
    public ICommand Copy { get { return _copyCommand; } } 
} 

所以現在我想弄清楚如何在主編輯器viewmodel中動態地公開這些組而不用硬編碼它們。我想到了像裝飾者模式的東西:

class ClipCommands: EditorBase 
{ 
    ClipCommands(EditorBase editor) {} 
    // expose my commands 

    // (!?) how do I expose any others already attached? 
} 

然後,我可以只是構建我想要的所有功能。

var editor = new EditorBase(new ClipCommands(new RedactCommands())); 

但我迷失在如何公開可能已被任何其他組連接的數據綁定。這是錯誤的方法?

回答

1

如果您使用的是Office風格的Ribbon控件,那麼正確UX模式是把羣體納入不同的選項卡上的絲帶,然後控制其標籤在運行時

<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 

... 

<ribbon:RibbonTab Visibility="{Binding ShowThisRibbonTab, Converter={StaticResource BooleanToVisibilityConverter}}"> 
</ribbon:RibbonTab> 

如果你想可見使選項卡內的組可見,然後綁定RibbonGroups的可見性而不是

編輯我想我誤解了這個問題。它不是你有問題的UI,而是你的ViewModel的組成。

您可以將每個RibbonGroup的DataContext設置爲不同的ViewModel。

<ribbon:RibbonTab DataContext="{Binding EditViewModel}"> 
</ribbon:RibbonTab> 
<ribbon:RibbonTab DataContext="{Binding FormatViewModel}"> 
</ribbon:RibbonTab> 
<ribbon:RibbonTab DataContext="{Binding PrintViewModel}"> 
</ribbon:RibbonTab> 

我實現了一些類似的地方,用戶可以創建自己的按鈕來進入功能區控件。我使用Actipro軟件的Ribbon控件。我將RibbonGroup項目模板更改爲水平方向的ItemsControl,並將ItemsSource綁定到我的ViewModel類中的「Actions」屬性,每個通用Action類都有一個該按鈕的命令,該命令調用執行該操作的Invoke方法。

+0

是的,這不是UI,而是我正在努力的虛擬機。如果我們在選項卡和它們包含的功能之間有一對一的關係,那麼每個選項卡單獨的datacontext可能會工作,但我們不這樣做。一個選項卡可能需要來自3或4個不同組命令的功能,這些命令也是基於上下文動態創建的。 – amnesia

+0

查看編輯答案。爲每個命令創建一個通用類,讓您的ViewModel決定將哪些命令加載到集合中並編輯功能區模板,以便將按鈕綁定到ItemsSource。 –

+0

有趣的方法,我沒有考慮使用集合的命令綁定。謝謝。 – amnesia

相關問題