リボンからコンテンツ コントロールにコマンドをバインドするホットな方法を考えようとしています。
私の見解は次のようになります。
<Window.Resources>
<DataTemplate DataType="{x:Type VM:CityViewModel}">
<Views:EditorView />
</DataTemplate>
<DataTemplate DataType="{x:Type VM:CountryViewModel}">
<Views:EditorView />
</DataTemplate>
<DataTemplate DataType="{x:Type VM:SomeOtherViewModel}">
<Views:SomeOtherView />
</DataTemplate>
</Window.Resources>
<DockPanel>
<Fluent:Ribbon x:Name="MainRibbon"
AutomaticStateManagement="True"
DockPanel.Dock="Top">
<Fluent:RibbonTabItem Header=SomeHeader>
<Fluent:RibbonGroupBox Header="Actions">
<Fluent:Button Fluent:RibbonAttachedProperties.RibbonSizeDefinition="Middle,Small"
Header="New"
Command = "{Binding NewCommand}"
CommandTarget="{Binding ElementName=SubView}"/>
<Fluent:Button Fluent:RibbonAttachedProperties.RibbonSizeDefinition="Middle,Small" Header="Save"
Command = "{Binding SaveCommand}"
CommandTarget="{Binding ElementName=SubView}"/>
</Fluent:RibbonGroupBox>
</Fluent:RibbonTabItem>
</Fluent:Ribbon>
<ContentControl Name="SubView" Content="{Binding CurentSubView}" />
</DockPanel>
MainViewModel は IOC から CurrentSubView を設定します。
CurentSubView = ViewModelFactory.Create<SomeViewModel>();
CityViewModel
からCountryViewModel
派生し、基本クラスEditorViewModel<T>
に配置された基本的なアクションを共有しますEditorViewModel<T>
public RelayCommand NewCommand { get; private set; }
public RelayCommand SaveCommand { get; private set; }
等....
私にとっての質問は、子ビューモデルからリボンにコマンドを公開する方法ですか?
最初のビュー モデルとして、CurrentSubView はこれらのコマンドを実装していないため、「BindingExpression パス エラー: 'NewCommand' プロパティが 'object' ''MainViewModel' に見つかりませんでした」というメッセージが表示されます.....
追加した MainViewModel のいくつかのコードでコマンドをバインドすることができました:
private RelayCommand m_newCommand;
public RelayCommand NewCommand
{
get { return m_newCommand; }
}
if (typeof(IEditorViewModel).IsInstanceOfType(CurentSubView)) { m_newCommand = ((IEditorViewModel)CurentSubView).NewCommand; RaisePropertyChanged(() => NewCommand); } else { m_newCommand = null; }
しかし、よりエレガントな提案のためにまだ開かれています ;)