2017-12-17 13 views
0

マスターディテール関係で2つのビューモデルを使用してビューを作成したいとします。wpf c#DependencyPropertyを介して2つのビューモデルをバインドする

1つのマスタービューモデルのSelectedCustomerを詳細ビューモデルのSelectedCustomerにバインドしたいとします。私はDependencyPropertyの実装は仕事をすることができますが、私は親ビューで別の顧客を選択するので、プロパティは更新されていないことをお読みください。私は間違って何をしているすべてのアイデア?

おかげ

のviewmodelsのコードである:ビューのXAMLである

namespace BindingViewModels.ViewModels 
{ 
    public class vmCustomers : INotifyPropertyChanged 
    { 
     protected ObservableCollection<Customer> _customers; 
     protected Customer _SelectedCustomer = null; 
     public event PropertyChangedEventHandler PropertyChanged; 

     public vmCustomers() 
     { 
      _customers = new ObservableCollection<Customer>(); 

      _customers.Add(new Customer() { CustomerID = 1, CustName = "John Doe" }); 
      _customers.Add(new Customer() { CustomerID = 2, CustName = "Johny Walker" }); 
      _customers.Add(new Customer() { CustomerID = 3, CustName = "Joe Foreman" }); 
      _customers.Add(new Customer() { CustomerID = 4, CustName = "Mike Tyson" }); 
      _customers.Add(new Customer() { CustomerID = 5, CustName = "Salvatore Ferragamo" }); 
      _customers.Add(new Customer() { CustomerID = 6, CustName = "Pato Donald" }); 
     } 

     public ObservableCollection<Customer> Customers 
     { 
      get { return _customers; } 
      set { _customers = value; } 
     } 

     public Customer SelectedCustomer 
     { 
      get 
      { 
       return _SelectedCustomer; 
      } 

      set 
      { 
       _SelectedCustomer = value; 
       OnPropertyChanged("SelectedCustomer"); 
      } 
     } 

     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
       handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    public class vmOrders : DependencyObject 
    { 
     public static readonly DependencyProperty SelectedCustomerProperty = 
      DependencyProperty.Register("SelectedCustomer", 
       typeof(Customer), 
       typeof(vmOrders), 
       new PropertyMetadata(default(Customer), OnItemsPropertyChanged)); 

     private static void OnItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      throw new NotImplementedException(); 
     } 

     protected ObservableCollection<Order> _AllOrders; 
     protected ObservableCollection<Order> _CustomerOrders = null; 
     protected Customer _SelectedCustomer = null; 

     public vmOrders() 
     { 
      _AllOrders = new ObservableCollection<Order>(); 

      _AllOrders.Add(new Order() { OrderID = 1, CustomerID = 1, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 100 }); 
      _AllOrders.Add(new Order() { OrderID = 2, CustomerID = 1, Date = System.DateTime.Parse("2017-01-02"), TotalAmount = 200 }); 
      _AllOrders.Add(new Order() { OrderID = 3, CustomerID = 1, Date = System.DateTime.Parse("2017-01-03"), TotalAmount = 300 }); 
      _AllOrders.Add(new Order() { OrderID = 4, CustomerID = 1, Date = System.DateTime.Parse("2017-01-04"), TotalAmount = 400 }); 
      _AllOrders.Add(new Order() { OrderID = 5, CustomerID = 2, Date = System.DateTime.Parse("2017-01-05"), TotalAmount = 500 }); 
      _AllOrders.Add(new Order() { OrderID = 6, CustomerID = 2, Date = System.DateTime.Parse("2017-01-06"), TotalAmount = 600 }); 
      _AllOrders.Add(new Order() { OrderID = 7, CustomerID = 3, Date = System.DateTime.Parse("2017-01-07"), TotalAmount = 700 }); 
      _AllOrders.Add(new Order() { OrderID = 8, CustomerID = 3, Date = System.DateTime.Parse("2017-01-08"), TotalAmount = 800 }); 
      _AllOrders.Add(new Order() { OrderID = 9, CustomerID = 3, Date = System.DateTime.Parse("2017-01-09"), TotalAmount = 900 }); 
      _AllOrders.Add(new Order() { OrderID = 10, CustomerID = 3, Date = System.DateTime.Parse("2017-01-10"), TotalAmount = 1000 }); 
      _AllOrders.Add(new Order() { OrderID = 11, CustomerID = 3, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 1200 }); 
      _AllOrders.Add(new Order() { OrderID = 12, CustomerID = 3, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 1400 }); 
      _AllOrders.Add(new Order() { OrderID = 13, CustomerID = 4, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 1200 }); 
      _AllOrders.Add(new Order() { OrderID = 14, CustomerID = 4, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5450 }); 
      _AllOrders.Add(new Order() { OrderID = 15, CustomerID = 4, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5020 }); 
      _AllOrders.Add(new Order() { OrderID = 16, CustomerID = 4, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5020 }); 
      _AllOrders.Add(new Order() { OrderID = 17, CustomerID = 5, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5030 }); 
      _AllOrders.Add(new Order() { OrderID = 18, CustomerID = 5, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5050 }); 
     } 

     public ObservableCollection<Order> Orders 
     { 
      get { 
       if (SelectedCustomer != null) 
        return _CustomerOrders; 
       else 
        return _AllOrders; 
      } 
      set { 
       _AllOrders = value; 
       if (SelectedCustomer != null) 
       { 
        var linqresults = _AllOrders.Where(o => o.CustomerID == _SelectedCustomer.CustomerID); 
        _CustomerOrders = new ObservableCollection<Order>(linqresults); 
       } 
       else 
       { 
        _CustomerOrders = null; 
       } 
      } 
     } 

     public Customer SelectedCustomer 
     { 
      get 
      { 
       return (Customer)GetValue(SelectedCustomerProperty); 
      } 

      set 
      { 
       SetValue(SelectedCustomerProperty, value); 
       _SelectedCustomer = SelectedCustomer; 
      } 
     } 
    } 

<Window x:Class="BindingViewModels.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:BindingViewModels" 
     xmlns:ViewModels="clr-namespace:BindingViewModels.ViewModels" 
     xmlns:Views="clr-namespace:BindingViewModels.Views" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type ViewModels:vmCustomers}"> 
      <Views:ViewCustomers/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type ViewModels:vmOrders}"> 
      <Views:ViewOrders/> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="200"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <ContentPresenter Grid.Row="0" Name="ContentCustomers" Content="{Binding ElementName=vmCustomersInstance}"> 
      <ContentPresenter.DataContext> 
       <ViewModels:vmCustomers x:Name="vmCustomersInstance"/> 
      </ContentPresenter.DataContext> 
     </ContentPresenter> 
     <ContentPresenter Grid.Row="1" Name="ContentOrders" Content="{Binding ElementName= vmOrdersInstance}" MouseEnter="ContentOrders_MouseEnter"> 
      <ContentPresenter.DataContext> 
       <ViewModels:vmOrders x:Name="vmOrdersInstance" SelectedCustomer="{Binding ElementName=vmCustomersInstance, Path=SelectedCustomer, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" /> 
      </ContentPresenter.DataContext> 
     </ContentPresenter> 
    </Grid> 
</Window> 

両方のビューは、グリッドとデータグリッドを持つユーザーコントロールです。

<UserControl x:Class="BindingViewModels.Views.ViewCustomers" 
.... 
<Grid> 
    <DataGrid Name="DataGrid" ItemsSource="{Binding Path=Customers}" SelectedItem="{Binding Path=SelectedCustomer}" AutoGenerateColumns="True" ScrollViewer.VerticalScrollBarVisibility="Visible"/> 
</Grid> 

<UserControl x:Class="BindingViewModels.Views.ViewOrders" 
.... 
<Grid> 
    <DataGrid Name="DataGrid" ItemsSource="{Binding Path=Orders}" AutoGenerateColumns="True" ScrollViewer.VerticalScrollBarVisibility="Visible"/> 
</Grid> 
+0

はIMOそれは、あなたがそれを正しく実装しなかったこと以外(vmOrdersでSelectedCustomerのための依存関係プロパティを持ってしても意味がありません'Mode = OneWayToSource'は疑わしいと思われます)。代わりに、ビューのSelectedItemをバインドします。 – Clemens

+0

Binding.Modeですべてのモードを試しましたが、いずれもトリックは行いませんでした。プロパティを正しく実装するための正しい方向で私を指摘できますか? –

答えて

0

多くの試みの後、私はついにそれを動作させました。

組み合わせビュー:

<Window x:Class="BindingVM2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:BindingVM2" 
     xmlns:ViewModels="clr-namespace:BindingVM2.ViewModels" 
     xmlns:Views="clr-namespace:BindingVM2.Views" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type ViewModels:vmCustomers}"> 
      <Views:ViewCustomers/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type ViewModels:vmOrders}"> 
      <Views:ViewOrders/> 
     </DataTemplate> 
     <ViewModels:vmCustomers x:Key="vmCustomerInstance" /> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="200"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <ContentPresenter Grid.Row="0" Name="ContentCustomers" Content="{StaticResource vmCustomerInstance}"/> 
     <ContentPresenter Grid.Row="1" Name="ContentOrders" Content="{Binding ElementName=vmOrdersInstance}"> 
      <ContentPresenter.DataContext> 
       <ViewModels:vmOrders x:Name="vmOrdersInstance" SelectedCustomer="{Binding Source={StaticResource vmCustomerInstance}, Path=SelectedCustomer , Mode=TwoWay}" /> 
      </ContentPresenter.DataContext> 
     </ContentPresenter> 
    </Grid> 
</Window> 

とのviewmodels:

public class vmCustomers : DependencyObject, INotifyPropertyChanged 
    { 
     protected ObservableCollection<Customer> _customers; 
     public event PropertyChangedEventHandler PropertyChanged; 

     public static DependencyProperty SelectedCustomerProperty = 
      DependencyProperty.Register("SelectedCustomer", typeof(Customer), typeof(vmCustomers), 
         new PropertyMetadata(default(Customer), new PropertyChangedCallback(OnSelectedCustomerChanged))); 

     private static void OnSelectedCustomerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      Customer value = (Customer)e.NewValue; 
      vmCustomers vm = (vmCustomers)d; 

      vm.OnPropertyChanged("SelectedCustomer"); 
     } 

     public Customer SelectedCustomer 
     { 
      get { return (Customer)GetValue(SelectedCustomerProperty); } 
      set { SetValue(SelectedCustomerProperty, value); } 
     } 


     public vmCustomers() 
     { 
      _customers = new ObservableCollection<Customer>(); 

      _customers.Add(new Customer() { CustomerID = 1, CustName = "John Doe" }); 
      _customers.Add(new Customer() { CustomerID = 2, CustName = "Johny Walker" }); 
      _customers.Add(new Customer() { CustomerID = 3, CustName = "Joe Foreman" }); 
      _customers.Add(new Customer() { CustomerID = 4, CustName = "Mike Tyson" }); 
      _customers.Add(new Customer() { CustomerID = 5, CustName = "Salvatore Ferragamo" }); 
      _customers.Add(new Customer() { CustomerID = 6, CustName = "Pato Donald" }); 
     } 

     public ObservableCollection<Customer> Customers 
     { 
      get { return _customers; } 
      set { _customers = value; } 
     } 

     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
       handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    public class vmOrders : DependencyObject ,INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     protected ObservableCollection<Order> _AllOrders; 
     protected ObservableCollection<Order> _CustomerOrders = null; 

     public static DependencyProperty SelectedCustomerProperty = 
        DependencyProperty.Register("SelectedCustomer", typeof(Customer), typeof(vmOrders), 
         new FrameworkPropertyMetadata(default(Customer), new PropertyChangedCallback(OnSelectedCustomerPropertyChanged))); 

     private static void OnSelectedCustomerPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      Customer value = (Customer)e.NewValue; 
      vmOrders vm = (vmOrders)d; 

      vm.ApplyFilter(); 
      vm.OnPropertyChanged("Orders"); 
     } 

     public Customer SelectedCustomer 
     { 
      get {return (Customer)GetValue(SelectedCustomerProperty); } 
      set { SetValue(SelectedCustomerProperty, value); } 
     } 

     public vmOrders() 
     { 
      _AllOrders = new ObservableCollection<Order>(); 

      _AllOrders.Add(new Order() { OrderID = 1, CustomerID = 1, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 100 }); 
      _AllOrders.Add(new Order() { OrderID = 2, CustomerID = 1, Date = System.DateTime.Parse("2017-01-02"), TotalAmount = 200 }); 
      _AllOrders.Add(new Order() { OrderID = 3, CustomerID = 1, Date = System.DateTime.Parse("2017-01-03"), TotalAmount = 300 }); 
      _AllOrders.Add(new Order() { OrderID = 4, CustomerID = 1, Date = System.DateTime.Parse("2017-01-04"), TotalAmount = 400 }); 
      _AllOrders.Add(new Order() { OrderID = 5, CustomerID = 2, Date = System.DateTime.Parse("2017-01-05"), TotalAmount = 500 }); 
      _AllOrders.Add(new Order() { OrderID = 6, CustomerID = 2, Date = System.DateTime.Parse("2017-01-06"), TotalAmount = 600 }); 
      _AllOrders.Add(new Order() { OrderID = 7, CustomerID = 3, Date = System.DateTime.Parse("2017-01-07"), TotalAmount = 700 }); 
      _AllOrders.Add(new Order() { OrderID = 8, CustomerID = 3, Date = System.DateTime.Parse("2017-01-08"), TotalAmount = 800 }); 
      _AllOrders.Add(new Order() { OrderID = 9, CustomerID = 3, Date = System.DateTime.Parse("2017-01-09"), TotalAmount = 900 }); 
      _AllOrders.Add(new Order() { OrderID = 10, CustomerID = 3, Date = System.DateTime.Parse("2017-01-10"), TotalAmount = 1000 }); 
      _AllOrders.Add(new Order() { OrderID = 11, CustomerID = 3, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 1200 }); 
      _AllOrders.Add(new Order() { OrderID = 12, CustomerID = 3, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 1400 }); 
      _AllOrders.Add(new Order() { OrderID = 13, CustomerID = 4, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 1200 }); 
      _AllOrders.Add(new Order() { OrderID = 14, CustomerID = 4, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5450 }); 
      _AllOrders.Add(new Order() { OrderID = 15, CustomerID = 4, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5020 }); 
      _AllOrders.Add(new Order() { OrderID = 16, CustomerID = 4, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5020 }); 
      _AllOrders.Add(new Order() { OrderID = 17, CustomerID = 5, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5030 }); 
      _AllOrders.Add(new Order() { OrderID = 18, CustomerID = 5, Date = System.DateTime.Parse("2017-01-01"), TotalAmount = 5050 }); 
     } 

     public void ApplyFilter() 
     { 
      if (SelectedCustomer != null) 
      { 
       var linqresults = _AllOrders.Where(o => o.CustomerID == SelectedCustomer.CustomerID); 
       _CustomerOrders = new ObservableCollection<Order>(linqresults); 
      } 
      else 
      { 
       _CustomerOrders = null; 
      } 
     } 
     public ObservableCollection<Order> Orders 
     { 
      get { 
       if (SelectedCustomer != null) 
        return _CustomerOrders; 
       else 
        return _AllOrders; 
      } 
      set { 
       _AllOrders = value; 
       OnPropertyChanged("Orders"); 
      } 
     } 

     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
       handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 
関連する問題