La liaison de données pour une méthode en WPF

J'ai de la difficulté databinding un TextBox.Text de la propriété à une méthode de l'objet. L'idée est de permettre à l'utilisateur d'écrire dans un TextBox un nom de fichier et puis avoir un TextBlock de sortie que l'extension du fichier.

class GetFileInfo
{
    public string GetFileExtension(string fileName)
    {
        return Path.GetExtension(fileName);
    }
}

Voici mon code XAML:

<Window.Resources>
    <ObjectDataProvider x:Key="getFileInfo" MethodName="GetFileExtension" ObjectType="{x:Type local:GetFileInfo}">
        <ObjectDataProvider.MethodParameters>
            <sys:String>abc.text</sys:String>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

<StackPanel>
    <TextBox Name="textBox1">
        <TextBox.Text>
            <Binding Source="{StaticResource getFileInfo}" Path="MethodParameters[0]" BindsDirectlyToSource="True" UpdateSourceTrigger="PropertyChanged" />
        </TextBox.Text>
    </TextBox>
    <TextBlock Name="textBlock1" Text="{Binding Source={StaticResource getFileInfo}}"/>
</StackPanel>

Pour une raison quelconque, il n'est pas de faire quoi que ce soit. Anyknow pourrait préciser ce que peuvent être les raisons?
Voici ce que je vois sur le concepteur et quand je lance l'application:

le texte d'alt http://img64.imageshack.us/img64/6922/f0rki14feo3oa3groxm5kgm.png

Et voici ce qui se passe lorsque j'essaie de configurer d'autres de texte au moment de l'exécution:

le texte d'alt http://img684.imageshack.us/img684/1057/b52pnq1dm4i23qivizvpaqq.png
Ici, l'erreur est donnée par de débogueur lorsque vous tentez de définir d'autres types de texte au moment de l'exécution:

Système.De Windows.Erreur de données: 8 : Impossible d'enregistrer la valeur de la cible vers la source. BindingExpression:Path=MethodParameters[0]; DataItem='ObjectDataProvider' (HashCode=2207369); élément cible est "champ de texte" (Nom= "textBox1"); de la propriété cible est "Texte" (de type 'String') ArgumentException:'Système.ArgumentException: Objet de type " MME Internes.Les données.PropertyPathWorker+IListIndexerArg " ne peuvent pas être convertis en type 'System.Int32'.
au Système.RuntimeType.TryChangeType(la valeur de l'Objet, Binder Binder, CultureInfo culture, Boolean needsSpecialCast)
au Système.RuntimeType.CheckValue(la valeur de l'Objet, Binder Binder, CultureInfo culture, BindingFlags invokeAttr)
au Système.De la réflexion.MethodBase.CheckArguments(Object[] paramètres, Binder Binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
au Système.De la réflexion.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder Binder, Object[] paramètres, CultureInfo culture, skipVisibilityChecks Booléens)
au Système.De la réflexion.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder Binder, Object[] paramètres, CultureInfo culture)
au Système.De la réflexion.RuntimePropertyInfo.SetValue(Object obj, la valeur de l'Objet, BindingFlags invokeAttr, Binder Binder, Object[] index, CultureInfo culture)
au MME Internes.Les données.PropertyPathWorker.SetValue(Objet élément, la valeur de l'Objet)
au MME Internes.Les données.ClrBindingWorker.UpdateValue(la valeur de l'Objet)
au Système.De Windows.Les données.BindingExpression.UpdateSource(la valeur de l'Objet)'

Vous devez changer l'idée de la Méthode de reliure à la propriété. et apprendre la notion de INotifyPropertyChanged & DataContext. Google certains pattern MVVM.
+1 pour poser une question qui va aider beaucoup de personnes qui ne comprennent pas la liaison de données.

OriginalL'auteur devoured elysium | 2010-02-21