我有一个列表框,其项目模板中有不同的控件,如按钮,文本框等,我有一个集合,我与列表框绑定,它工作正常,但现在我想将我的代码移动到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的新手,请帮助,可能是我缺少一些小东西来绑定我的命令,但我很困惑,如何在我的集合中添加命令,以便我可以在我的观点中得到它们
答案 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
,应该工作。