我实际上有 -
<UserControl ...>
<Grid>
<TreeView Name="nTree">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="NodeType" ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<Image x:Name="icon" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</UserControl>
NodeType是底层库返回的类型。我想根据提供的名称设置图标图像源 - 但是我不能修改NodeType来添加一个getter。
理想情况下,我想要的是将图标图像源绑定到UserControl类上的一个函数,该函数接收Name并返回一个ImageSource。
即
public partial class Panel : UserControl
{
public Panel(NodeType n)
{
nTree.Items.add(n);
}
public ImageSource GetIcon(string name)
{
...
}
}
这感觉应该是可能的,但我正在努力解决这个问题。将不胜感激。
答案 0 :(得分:1)
不幸的是,您无法绑定到方法,您需要将方法转换为属性
你可以用几种方式做到这一点
最简单的方法是:(虽然这应该在你的VM而不是你的V)
public ImageSource Icon
{
...
}
或者您可以使用值转换器:(最适合您所描述的内容)
public class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
GetImageLogic
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException("One way only");
}
}
第三种选择是使用CommandBinding:
然后绑定到命令
CommandBinding OpenCmdBinding = new CommandBinding(
ApplicationCommands.Open,
OpenCmdExecuted,
OpenCmdCanExecute);
this.CommandBindings.Add(OpenCmdBinding);
void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
String command, targetobj;
command = ((RoutedCommand)e.Command).Name;
targetobj = ((FrameworkElement)target).Name;
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj);
}
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}