avalondock如何以编程方式绑定Title, IsSelected等属性

本文关键字:Title IsSelected 属性 绑定 方式 编程 avalondock | 更新日期: 2023-09-27 17:49:16

我使用avalondock版本2。我想知道如何以编程方式绑定标题,IsSelected等属性。从LayoutDocument到ViewModel。我想使用SetBinding,但不幸的是,LayoutDocument没有这样的方法。

我知道这种方法,但不幸的是它不适合我。我做DockingService控制Windows和DockingService有一个方法

public void ShowDocumentWindow<TViewModel>() where TViewModel : DocumentItemViewModel
    {
        var viewModel = this.CreateViewModel(typeof(TViewModel));
        var view = this.CreateView(viewModel);
        var documentPane = this.dockingManager.Layout.Descendents().OfType<LayoutDocumentPane>().FirstOrDefault();
        if (documentPane != null)
        {
            var layoutDocument = new LayoutDocument
            {
                Content = view
            };
            documentPane.Children.Add(layoutDocument);
        }
    }

但是我不知道如何在这个方法中绑定属性Title, IsSelected

avalondock如何以编程方式绑定Title, IsSelected等属性

您必须在视图中将ViewModel的实例设置为DataContext。之后,你就可以在你想要绑定的属性上使用例如Text="{Binding Path=YourProperty}"了。

从这篇如何:在代码中创建绑定,你可以使用BindingOperations.SetBinding

所以你的代码可以变成这样(以绑定标题为例):
public void ShowDocumentWindow<TViewModel>() where TViewModel : DocumentItemViewModel
{
    var viewModel = this.CreateViewModel(typeof(TViewModel));
    var view = this.CreateView(viewModel);
    var documentPane = this.dockingManager.Layout.Descendents().OfType<LayoutDocumentPane>().FirstOrDefault();
    if (documentPane != null)
    {
        var layoutDocument = new LayoutDocument
        {
            Content = view
        };
        Binding binding = new Binding("SomeProperty"); //viewModel.SomeProperty
        binding.Source = viewModel;
        BindingOperations.SetBinding(layoutDocument, LayoutDocument.TitleProperty, binding);
        documentPane.Children.Add(layoutDocument);
    }
}