MVVM:将命令绑定到WPF中的Listbox

时间:2014-06-10 08:37:07

标签: wpf mvvm

我有一个列表框,其项目模板中有不同的控件,如按钮,文本框等,我有一个集合,我与列表框绑定,它工作正常,但现在我想将我的代码移动到MVVM,我在我的视图模型中写了一些命令来点击按钮的事件,我如何将我的集合+我的命令绑定到列表框?因为命令不在集合中,这是我的列表框的数据模板

<DataTemplate x:Key="listItemTemplate">
    <Grid ShowGridLines="False">
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <DockPanel Grid.Row="0" Name="commentsPanel" LastChildFill="False" MinWidth="350">
            <TextBlock  Name="txtUserName" IsEnabled="False" Text="{Binding UserName}" 
                      Width="Auto" DockPanel.Dock="Left" Foreground="GhostWhite" Margin="0,6,0,0"></TextBlock>

            <TextBlock Name="txtDate" IsEnabled="False" Text="{Binding CreateDt}"
                      Width="Auto" DockPanel.Dock="Left" Foreground="Green" Margin="4,6,0,0"></TextBlock>

            <StackPanel DockPanel.Dock="Right" Orientation="Horizontal" Width="{Binding EditPanelWidth}" x:Name="EditDeletePanel" Visibility="{Binding ButtonVisibilityText }">
                <Button Name="btnEdit" Content="Edit" Width="Auto" DockPanel.Dock="Right" Height="20"
                  Click="btnEdit_Click_1" Margin="4,4,0,4" Foreground="GhostWhite" VerticalContentAlignment="Top" Visibility="{Binding ButtonVisibilityText}"></Button>

                <Button Name="btnDelete" Content="Delete" Width="Auto" Height="20" VerticalContentAlignment="Top" DockPanel.Dock="Right" Visibility="{Binding ButtonVisibilityText}"
                Click="btnDelete_Click_1" Margin="4"></Button>

            </StackPanel>

            <StackPanel DockPanel.Dock="Right" Orientation="Horizontal" x:Name="SaveCancelPanel" Visibility="{Binding CancelSaveEnableText}">
                <Button Name="btnSave" Content="Save" Width="Auto" Height="20" DockPanel.Dock="Right" 
                Click="btnSave_Click_1" Margin="4"></Button>

                <Button Name="btnCancel" Content="Cancel" Height="20" Width="Auto" DockPanel.Dock="Right" 
                Click="btnCancel_Click_1" Margin="4"></Button>

            </StackPanel>
        </DockPanel>
        <dxe:TextEdit ShowBorder="False" Grid.Row="1" Name="txtComment" Width="Auto" Foreground="Red"  
                  TextWrapping="WrapWithOverflow" EditValue="{Binding Note}" IsEnabled="{Binding IsCommentTextEnable}">

        </dxe:TextEdit>
        <dxe:TextEdit Text=".............." Grid.Row="2" ShowBorder="False" IsEnabled="False">

        </dxe:TextEdit>
    </Grid>
</DataTemplate>

这里是我想要绑定到按钮的集合+我的命令,

public ICommand CancelCommand
{
    get { return _cancelCommand ?? (_cancelCommand = new CommandHandler(Cancel)); }
    set { _cancelCommand = value; }
}



public TList<ProgramNote> NotesCollection
{
    get { return _notes; }
    set
    {
        _notes = value;
        RaisePropertyChanged("NotesCollection");
    }
}

我知道我可以使用此代码通过按钮

绑定我的命令
<Button Command={Binding CancelCommand}

但是这个命令不存在于集合中,我是MVVM的新手,请帮助,可能是我缺少一些小东西来绑定我的命令,但我很困惑,如何在我的集合中添加命令,以便我可以在我的观点中得到它们

3 个答案:

答案 0 :(得分:2)

您可以通过查找相应的viewmodel

将命令绑定到数据模板按钮等

例如

 <DataTemplate x:Key="listItemTemplate">
    <Button Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=LixtBox}}" 
            CommandParameter="{Binding}">
 </DataTemplate>

在示例中我们将找到LixtBox的datacontext,我假设它是您的viewmodel然后将绑定到该命令并将当前对象作为命令参数传递以执行操作。

然后,您将在命令的实现中接收该项作为参数

public void Execute(object parameter)
{
    ProgramNote note = parameter as ProgramNote;
    //your logic here, eg cancelling download etc.
}

答案 1 :(得分:1)

Thanx对你们所有人特别感谢@sheridan和@PushPraj,我现在能够做到,这里是数据模板的代码,我有一个按钮

<Button Name="btnCancel" Content="Cancel" Height="20" Width="Auto" DockPanel.Dock="Right" 
                        Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dxe:ListBoxEdit}}"
                               CommandParameter="{Binding}" Margin="4"></Button>

这是ListBox的代码

<dxe:ListBoxEdit Name="listComments" Grid.Row="1" ItemTemplate="{StaticResource  listItemTemplate}" 
                                                                                 ItemsSource="{Binding NotesCollection}"
                                                                     ScrollViewer.HorizontalScrollBarVisibility="Disabled"  ScrollViewer.VerticalScrollBarVisibility="Visible" >
                                                                </dxe:ListBoxEdit>

最后这是我的后端代码

listComments.DataContext = viewModel;

答案 2 :(得分:0)

总是很难回答新用户的问题,因为他们总是从他们的问题中遗漏重要信息。但是,根据您的问题文本判断,我觉得您已将集合属性设置为DataContext的{​​{1}}。如果您希望数据绑定到您的命令,那么您需要将Window更改为包含集合命令的对象...你的观点模型:

DataContext

现在DataContext = new YouViewModel(); 已设置为视图模型的实例,您可以在向我们展示数据时将数据绑定到其属性:

DataContext

...

<Button Command="{Binding CancelCommand}" />

啊,抱歉,我误解了 - 所以<ListBox ItemsSource="{Binding NotesCollection}" /> Button。在这种情况下,你可以尝试这样的事情:

ListBox

这应该超出集合范围,查看<Button Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 的{​​{1}},因此如果您已将视图模型的实例设置为DataContext,应该工作。