Da l'editor XAML, posso impostare lo spazio dei nomi per il ViewModel contenuta in un progetto C#Databinding un F # viewmodel
namespace ViewModelDB
{
public class DependencyViewModel : IViewModelDB
{
public string Message { get; set; }
}
}
E nella mia XAML
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ViewModelDB="clr-namespace:ViewModelDB;assembly=ViewModelDB"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
>
<UserControl.DataContext>
<ViewModelDB:DependencyViewModel/>
</UserControl.DataContext>
<Grid>
<TextBlock Text="{Binding Message}"/>
</Grid>
</UserControl>
Il "messaggio" legame è quindi riconosciuto.
Quando io punto ad un F # namespace di circoscrizione simile
namespace ModuleDBGraph
open Infrastructure
open Microsoft.Practices.Prism.Regions;
open Microsoft.Practices.Unity;
type IDependencyViewModel =
inherit IViewModel
abstract Message : string with get, set
type DependencyViewModel() =
interface IDependencyViewModel with
member val Message = "" with get, set
Ho poi perdo il riconoscimento del Messaggio vincolante
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ViewModelDB="clr-namespace:ViewModelDB;assembly=ViewModelDB"
xmlns:ViewModelDBFS="clr-namespace:ModuleDBGraph;assembly=ViewModelDBGraphFS"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
>
<UserControl.DataContext>
<ViewModelDBFS:DependencyViewModel/>
</UserControl.DataContext>
<Grid>
<TextBlock Text="{Binding Message}"/>
</Grid>
</UserControl>
Sto facendo qualcosa di sbagliato? Ciò è dovuto al fatto che il messaggio è un'implementazione dell'interfaccia IDependencyViewModel e l'implementazione esplicita delle interfacce in F #, che è una buona cosa, ma è qui per risolvere il problema?
Come dici tu - questo è probabilmente perché l'implementazione dell'interfaccia è esplicita. La solita soluzione è semplicemente aggiungere una proprietà denominata 'Message' al tipo stesso (e l'implementazione dell'interfaccia può fare riferimento ad essa). –
(Penso che seguire le linee guida C# non funzioni altrettanto bene per F # + WPF, quindi forse puoi trovare un modo migliore per scrivere il codice. Ad esempio, hai bisogno di un'interfaccia vista modello?) –
Immagino aggiungere una proprietà è l'approccio più leggero. E probabilmente avere un'interfaccia è eccessivo. anche se per DI è proprio il punto. – nicolas