Вы должны быть в состоянии сделать это, используя ObjectDataProvider
для выполнения метода, а затем привязать присоединенное свойство к возвращаемому значению провайдера.
Сначала вам нужно настроить провайдера как ресурс:
<Window.Resources>
<ObjectDataProvider x:Key="readOnlyProvider" ...>
<ObjectDataProvider.MethodParameters>
...
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
Затем используйте провайдера в качестве источника привязки прикрепленного свойства:
<TextBox Text="{Binding PoolNum, Mode=OneWay}" Windows:AttachedProperties.IsReadOnlyOn="{Binding Source={StaticResource readOnlyProvider}}" />
Сложной частью этого процесса будет «передача» значения в ObjectDataProviders.MethodParameters
,Это можно сделать в XAML, и есть несколько ресурсов, чтобы показать вам, как это делается;вот для начала: http://weblogs.asp.net/psheriff/archive/2010/02/23/bind-objectdataprovider-method-parameters-in-wpf.aspx
ОБНОВЛЕНИЕ
Для вашего комментария, вот два способа, которыми ObjectDataProvider
может выполнить метод для вашего представления DataContext
без создания нового объекта.
Сначала сделайте метод модели представления статичным и используйте свойство ObjectType
:
<ObjectDataProvider x:Key="readOnlyProvider"
ObjectType="{x:local MyDataContext}"
MethodName="IsPropertyReadOnly">
...
</ObjectDataProvider>
Или установите ObjectInstance
поставщика в представлениеDataContext
при загрузке представления:
public class MyWindow : Window
{
public MyWindow()
{
InitializeComponent();
var readOnlyProvider = this.Resources["readOnlyProvider"] as ObjectDataProvider;
readOnlyProvider.ObjectInstance = this.DataContext;
}
}
Нет способа привязки к методам в XAML, и единственные известные мне обходные пути использования ObjectDataProvider
.