在绑定

时间:2017-02-07 14:51:00

标签: c# wpf

我实际上有 -

<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)
    {
        ...
    }
}

这感觉应该是可能的,但我正在努力解决这个问题。将不胜感激。

1 个答案:

答案 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;
}