5

XAMLエディターから、名前空間をC#プロジェクトに含まれるViewmodelに設定できます

namespace ViewModelDB
{
    public class DependencyViewModel : IViewModelDB
    {
        public string Message { get; set; }
    }
}

そして私の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>

次に、バインディング「メッセージ」が認識されます。

同様の構成要素のF#名前空間を指すと

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

次に、拘束力のあるメッセージの認識を失います

<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>

私は何か間違ったことをしていますか?これは、メッセージがインターフェイスIDependencyViewModelの実装であり、F#でのインターフェイスの明示的な実装であるためです。これは良いことですが、ここでこれを回避する方法はありますか?

4

1 に答える 1

6

コメントで説明したものよりも良い解決策はないと思うので、それをより長い答えに変えています。

これが機能しない理由は、すでに提案したように、F#がインターフェイスを明示的に実装しているため、WPFがMessageインターフェイスメンバーである場合にプロパティを認識しないためです。最も直接的な回避策は、それを明示的なプロパティとして定義することです(そして、インターフェイスの実装はメインのプロパティを参照するだけです)。

type DependencyViewModel () = 
    member val Message = "" with get, set
    interface IDependencyViewModel with 
        member x.Message with get() = x.Message and set(v) = x.Message <- v

一般に、C#で推奨されるパターンは、F#では必ずしもうまく機能するとは限りません。たとえば、F#はより簡潔で(書き直しが容易に)、エラーが発生しにくい(静的により多くのバグをキャッチする)ため、この場合、実際にはインターフェイスはまったく必要ないかもしれません。

より複雑な回避策は、実行時にリフレクションを使用して(明示的な実装から)インターフェイスの暗黙的な実装を生成し、それをとして設定することDataContextですが、エディターではうまく機能しないため、これは適切な方向ではない可能性があります。

于 2013-03-18T17:23:47.430 に答える