【问题标题】:Silverlight call command from button within listbox item template从列表框项目模板中的按钮调用 Silverlight 命令
【发布时间】:2011-06-01 14:24:06
【问题描述】:

我已经看到这个问题被问了几次,但我还没有看到能够找到我的场景的完整答案。

在我的项目中,我有一个作为列表框项创建的用户控件。在这个用户控件中,我有一个按钮

            <Button x:Name="DetailButton"
                Grid.Column="1"
                Width="107"
                Height="23"
                Margin="196,94,0,0"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Click="MoreDetail_Click"
                Command="{Binding GetCFSDetailCommand}"
                Content="View Details [+]" />

按钮有一个特定于视图的单击事件,这基本上会根据可见性状态展开或折叠网格行。我在这里使用了一个事件,因为它是特定于 ui 的。这个按钮还有一个在虚拟机中调用的命令。

虚拟机代码

public class SearchViewModel : INotifyPropertyChanged
{
    private DelegateCommand _getCFSDetailCommand;
public DelegateCommand GetCFSDetailCommand
    {
        get
        {
            if (this._getCFSDetailCommand == null)
                this._getCFSDetailCommand = new DelegateCommand(GetCFSDetailCommandExecute, CanGetCFSDetailCommandExecute);

            return this._getCFSDetailCommand;      
        }

    }
private void GetCFSDetailCommandExecute(object parameter)
    {
        //bind collection to model call here
    }

我遇到的问题是按钮上的命令“丢失”或在列表框项内时从未调用过我将视图绑定到 vm,如果我将此命令放在视图中的任何其他按钮上叫。谁能帮我理解如何在列表框项中调用绑定到按钮的命令?

提前谢谢你

【问题讨论】:

    标签: silverlight mvvm listboxitem icommand


    【解决方案1】:

    兰迪克, 在您的原始(第一篇)帖子中,您将CommandParameter 绑定到列表项的本地数据上下文。在第二篇文章中,您错过了该绑定,我认为在第二个端口的上下文中这是不可能的。 在您的情况下,我建议使用 Element to Element binding 从父数据上下文绑定到 GetCFSDetailCommand 命令。

    【讨论】:

    • 谢谢萨福。而且您是正确的,元素到元素的绑定有助于解决用户控件(和内部按钮)从父页面丢失其数据上下文的问题。我也对原始帖子中的语法表示歉意,没有使用命令参数。我最初将它放在那里,因为我打算将参数传递给命令,但我最终使用了另一种方法。我已更新原始问题以消除混淆
    【解决方案2】:

    将用户控件中的命令作为列表框项调用的问题在于,模式正在控件的上下文中查找命令。显然,列表框项跳到了可视树之外,因此绑定不会被继承。
    为了纠正这个问题,我需要将按钮的数据上下文显式设置为 ViewModel。这最终通过使用 Element to Element 绑定来解决,它允许我将用户控件的数据上下文指向包含它的主视图。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      相关资源
      最近更新 更多