Tengo problemas para vincular una propiedad TextBox.Text
con el método de un objeto. La idea es permitir al usuario escribir en un TextBox
un nombre de archivo y luego tener un resultado TextBlock
de ese archivo.Enlace de datos a un método en WPF
class GetFileInfo
{
public string GetFileExtension(string fileName)
{
return Path.GetExtension(fileName);
}
}
Aquí es mi 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>
Por alguna razón no está haciendo nada. ¿Alguno de ustedes podría señalar cuáles pueden ser las razones? Esto es lo que veo en el diseñador y cuando corro la aplicación:
alt text http://img64.imageshack.us/img64/6922/f0rki14feo3oa3groxm5kgm.png
Y aquí es lo que sucede cuando intento configurar otro texto en tiempo de ejecución:
alt text http://img684.imageshack.us/img684/1057/b52pnq1dm4i23qivizvpaqq.png Aquí está la error dado por de depurador cuando se trata de establecer otro texto en tiempo de ejecución:
System.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=MethodParameters[0]; DataItem='ObjectDataProvider' (HashCode=2207369); target element is 'TextBox' (Name='textBox1'); target property is 'Text' (type 'String') ArgumentException:'System.ArgumentException: Object of type 'MS.Internal.Data.PropertyPathWorker+IListIndexerArg' cannot be converted to type 'System.Int32'. at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast) at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) at MS.Internal.Data.PropertyPathWorker.SetValue(Object item, Object value) at MS.Internal.Data.ClrBindingWorker.UpdateValue(Object value) at System.Windows.Data.BindingExpression.UpdateSource(Object value)'
Tienes que cambiar la idea de método de enlace a la propiedad. y aprende el concepto de INotifyPropertyChanged & DataContext. Google también un patrón MVVM. –
+1 para hacer una pregunta que ayudará a muchas personas que no entienden el enlace de datos. –