0

我正在尝试为可见性、工具提示和命令创建一个带有数据绑定的模板化按钮控件。可见性绑定有效,工具提示也有效,但命令无效。另一个进程负责注入视图模型并将其与视图相关联,并且其他数据绑定正在工作,所以我非常有信心它可以正常工作。

在资源字典中:

<Converters:BoolToVisibilityConverter x:Key="boolVisibilityConverter" />

<Style TargetType="local:ImageButton">
    <Setter Property="Visibility" Value="{Binding FallbackValue=Visible, Path=ToolIsAvailable, Converter={StaticResource boolVisibilityConverter} }"/>
    <Setter Property="Command" Value="{Binding ButtonCommand}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ImageButton">
                <Grid>
                <Image Source="{TemplateBinding Image}" 
                       ToolTipService.ToolTip="{Binding ToolName}"  />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

模板化控件

public class MyButton: ImageButton
{
    public MyButton(MyCommandViewModel viewmodel)
    {
        this.DefaultStyleKey = typeof(ImageButton);
        this.Image = new BitmapImage(new Uri("/MyProject;component/Themes/myimage.png", UriKind.Relative));
                this.DataContext = viewmodel;
    }

}

并在视图模型中

public MyCommandViewModel()
        : base("My Tool", true)
    {
    }


    public class CommandViewModel
    {
    public CommandViewModel(string toolName, bool isAvailable)
    {
                    ToolIsAvailable = isAvailable;
                    ToolName = toolName;
        _buttoncommand = new DelegateCommand(() =>
        {
            ExecuteCommand();
        },
        () => { return CanExecute; });
    }

    private bool _canExecute = true;
    public bool CanExecute
    {
        get { return _canExecute; }
        set 
        { 
            _canExecute = value; 
            OnPropertyChanged("CanExecute");  
            if (_command != null) _command.RaiseCanExecuteChanged();  
        }
    }

    private DelegateCommand _buttoncommand;
    public ICommand ButtonCommand
    {
        get { return _buttoncommand; }
    }
    protected virtual void ExecuteCommand()
    {
    }
    public bool ToolIsAvailable
    {
        get { return _toolIsReady; }
        set { _toolIsReady = value; OnPropertyChanged("ToolIsAvailable"); }
    }
    public string ToolName
    {
        get { return _toolName; }
        set { _toolName = value; OnPropertyChanged("ToolName"); }
    }
         }

为什么其他数据绑定正常运行但命令数据绑定不正常。我发现这个类似的帖子 在 WPF 中覆盖模板化按钮的命令 我是否需要模板化网格控件并使用 RoutedCommands?我不确定我是否理解为什么 Silverlight 将 Command 绑定与其他绑定不同,所以我怀疑我只是在代码中有一个错误。

4

2 回答 2

0

专门寻找数据上下文是否有效?

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.ButtonCommand}"
于 2012-04-18T15:38:33.763 回答
0

这是我的解决方案。使用与上面相同的 commandviewmodel 和相同的 MyCommandViewModel

<Style TargetType="local:ImageButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ImageButton">
                <Grid>
                <Image Source="{TemplateBinding Image}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

数据绑定现在在用户控件中完成

<UserControl x:Class="SilverlightApplication11.Test"
...
   >
    <UserControl.Resources>
        <Converters:BoolToVisibilityConverter x:Key="boolVisibilityConverter" />
    </UserControl.Resources>
    <Grid>
      <local:ImageButton Image="/SilverlightApplication11;component/Themes/hand.png" Command="{Binding ButtonCommand}" Visibility="{Binding FallbackValue=Visible, Path=ToolIsAvailable, Converter={StaticResource boolVisibilityConverter} }"/>
    </Grid>
</UserControl>

和背后的代码

    public Test(TestCommandViewModel vm)
    {
        InitializeComponent();

        this.Loaded += (o, e) => this.DataContext = vm;
    }
于 2012-04-19T02:26:52.433 回答