2009-09-01 9 views
0

私はViewModelを持つビューをdatacontext(コードで設定)として持っています。私の見解では、私リストボックス内のボタン上のリストプリズム:指揮官<T>

<UserControl x:Class="ZPOS.Modules.Menu.Views.DepartmentView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:prism="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation"> 
    <Grid> 
<Grid.Background> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FF9CA48A"/> 
       <GradientStop Color="#FFFFFFFF" Offset="1"/> 
       <GradientStop Color="#FF90A85C" Offset="0.5"/> 
      </LinearGradientBrush> 
     </Grid.Background> 
     <ListBox ItemsSource="{Binding Departments}" 
       SelectionChanged="ListBox_SelectionChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.Background> 
          <LinearGradientBrush> 
           <GradientStop Color="Black" Offset="0"/> 
           <GradientStop Color="White" Offset="1"/> 
          </LinearGradientBrush> 
         </Grid.Background> 
         <Grid.RowDefinitions> 
          <RowDefinition/> 
          <RowDefinition/> 
         </Grid.RowDefinitions> 
         <Button Height="Auto" HorizontalAlignment="Left" Margin="1,1,1,1" Grid.Column="0" Grid.Row="0" Content="{Binding Path=Name}" 
           prism:Click.Command="{Binding displayMenubyCategory}" VerticalAlignment="Bottom" Width="Auto"/> 
         <TextBlock Grid.Column="0" Grid.Row="1" Text="{Binding Path=Note}" /> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <Button Height="Auto" HorizontalAlignment="Left" Margin="1,1,1,1" Grid.Column="0" Grid.Row="0" Content="{Binding Path=Name}" prism:Click.Command="{Binding displayMenubyCategory}" VerticalAlignment="Bottom" Width="Auto"/> 

    </Grid> 
</UserControl> 

のViewModel

using System; 
using System.ComponentModel; 
using Microsoft.Practices.Composite.Events; 
using System.Collections.Generic; 
using ZPOS.Infrastructure; 
using ZPOS.Objects; 
using System.Collections.ObjectModel; 
using ZPOS.Modules.Menu.Views; 
using ZPOS.Contracts; 
using Microsoft.Practices.Composite.Presentation.Commands; 
namespace ZPOS.Modules.Menu.PresentationModels 
{ 
    public class DepartmentViewModel : IDepartmentViewModel, INotifyPropertyChanged 
    { 


     private readonly IEventAggregator eventAggregator; 
     private string _message; 
     IMenuService service; 

     public DelegateCommand<POSDepartment> displayMenubyCategory { get; private set; } 

     public string Name { get; set; } 



     private ObservableCollection<POSDepartment> deptItems; 
     public ObservableCollection<POSDepartment> Departments 
     { 
      get { return deptItems; } 
      private set 
      { 
       if (deptItems != value) 
       { 
        deptItems = value; 
        PropertyChanged(this, new PropertyChangedEventArgs("deptItems")); 
       } 
      } 
     } 

     public string Message 
     { 
      get { return _message; } 
      set 
      { 
       if (_message != value) 
       { 
        _message = value; 
        PropertyChanged(this, new PropertyChangedEventArgs("deptItems")); 
       } 
      } 
     } 



     public IDepartmentView View { get; private set; } 

     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

     private void NotifyPropertyChanged(string propertyName) 
     { 
      var handler = this.PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 





     public DepartmentViewModel(IDepartmentView deptView, IEventAggregator eventAggregator, IMenuService service) 
     { 
      this.View = deptView; 
      this.View.Model = this; 
      this.eventAggregator = eventAggregator; 
      this.service = service; 
      this.Name = "View for DepartmentModel"; 

      this.eventAggregator.GetEvent<DepartmentSelectionChangedEvent>().Subscribe(departmentSelectionChanged); 
      displayMenubyCategory = new DelegateCommand<POSDepartment>(ExecuteCommand1, CanExecuteCommand1); 

      PopulateDepartmentItems(); 
     } 


     private void ExecuteCommand1(POSDepartment commandParameter) 
     { 
     } 

     private bool CanExecuteCommand1(POSDepartment commandParameter) 
     { 
      return true; 
     } 

     public void departmentSelectionChanged(POSDepartment item) 
     { 
      this.Message = item.Name; 
     } 



     private void PopulateDepartmentItems() 
     { 
      try 
      { 

       List<POSDepartment> items = service.GetAllDepartments(); 

       deptItems = new ObservableCollection<POSDepartment>(items); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 


    } 
} 

クリックすると、コマンドを起動しませんしています。

リストボックスの外に同じボタンを配置すると、そのデリゲートが呼び出されます。

何か間違っていますか?

良い方法がありますか?私はまだプリズムには新しいです。また、コマンドが起動されたときに、パラメータ(リストボックス項目のデータコンテキスト)を渡したいと思います。

あなたはListBoxの内側に言うとき、私は右、あなたがListBoxItemTemplate内側に言っていると思いますか?あなたのすべての

+0

ありがとうskaffman – TheMar

答えて

2

ありがとうございましたか

ItemTemplateは、ListBoxに対して生成されたすべてのアイテムに適用されます。生成された各アイテムには、それが生成されたデータ項目に設定されたDataContextがあります。そのため、そのデータ項目にはdisplayMenubyCategoryというプロパティが必要です。そうしないと、バインディングは失敗します。 Visual Studioの出力ウィンドウで、バインディングエラーがないかどうかを確認します。 ListBoxButtonを移動

は、結合が成功しますので、すべてが動作することを意味する、異なるDataContext(あなたのビューモデル)を意味します。

のオプションがあります。

  1. がメインビューモデルの同じプロパティに呼び出すことができ、あなたのデータクラスにdisplayMenubyCategoryプロパティを追加します。
  2. バインディングを現在のDataContextRelativeSourceを参照)の外に見えるように変更します。
+0

@ Kent-超高速応答ありがとうございます。 いいえ2にチェックします。意味があるようです。 いいえ1. DataClassがそれを私のオブジェクト(POSDepartment)と言うときは? – TheMar

+0

@Kent - No 2.このトリックはアンダーソンが与えたサンプルからうまくやったのですか?それでも、私はプロパティを使用してそれを行う方法を知りたいです。 – TheMar

+0

彼はあなたのPOSDepartmentタイプが、あなたがバインドできる親viewModel上のコマンドを参照するプロパティを持つ必要があると言っています。例:public DelegateCommand displayMenubyCategory {get {return parentViewModel.displayMenubyCategory; }}。これには、Xamlで祖先バインディングを使用する必要がないという利点がありますが、C#で非常に同じ間接参照があるという欠点があります。それはあなたのボタンが簡単な{Binding displayMenubyCategory}に戻るためのバインドを許可します。それは何よりも味に関するものです。 –

3

前述のように、RelativeSourceを使用することができます。初めての使用方法は必ずしも明確ではないので、ここではサンプルを紹介します。私は(簡潔にするため、いくつかのボタンの属性を削除)これが機能すると思います:

<Button prism:Click.Command="{Binding 
RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type UserControl}}, Path=DataContext.displayMenubyCategory}" /> 

これはそれを行うべきです。これは、DataContextを親のViewModelに設定していることを前提としています。

+0

あなたは私のためにもう一度やりました。出来た。ありがとう。 – TheMar

関連する問題