2015-10-12 19 views
1

Pager.xaml(查看)我不能讓自定義控件的所選項目

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="Client.View.Pager"> 
    ... 
    <ListBox x:Name="listBoxEntries" 
      ItemsSource="{Binding Path=ListCollectionView}" 
      BorderThickness="0" 
      Margin="0" 
      Style="{StaticResource common}" 
      HorizontalContentAlignment="Stretch" 
      VerticalContentAlignment="Stretch" 
      ItemTemplate="{StaticResource templateTableCategory}" 
      SelectedItem="{Binding Path=SelectedEntry, Mode=TwoWay}"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Rows="{Binding Path=Rows}" 
          Columns="{Binding Path=Columns}" 
          IsItemsHost="True"/> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
    </ListBox> 
    ... 
</Grid> 

Pager.xaml.cs(代碼隱藏)

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 
using Client.Model; 
using Client.ViewModel; 

namespace Client.View 
{ 
    public partial class Pager 
    { 
     public static readonly DependencyProperty SelectedEntryProperty = DependencyProperty.Register("SelectedEntry", typeof(IPagableEntry), typeof(Pager)); 
     ... 
     public IPagableEntry SelectedEntry 
     { 
      get { return (DataContext as PagerViewModel).SelectedEntry; } 
      set { (DataContext as PagerViewModel).SelectedEntry = value; } 
     } 
     ... 
    } 
} 

PagerViewModel.cs

namespace Client.ViewModel 
{ 
    public class PagerViewModel : ViewModelBase 
    { 
     ... 

     IPagableEntry _selectedEntry; 
     public IPagableEntry SelectedEntry 
     { 
      get 
      { 
       return _selectedEntry; 
      } 

      set 
      { 
       _selectedEntry = value; 
       OnPropertyChanged("SelectedEntry"); 
      } 
     } 
     ... 
    } 
} 

MainPage.xaml(查看)

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="Client.View.MainPage" 
     Style="{StaticResource common}"> 
    <Page.DataContext> 
     <viewModel:MainPageViewModel/> 
    </Page.DataContext> 
    ... 

    <view:Pager x:Name="pagerTableCategories" 
      Grid.Row="0" 
      List="{Binding Path=PagerTableCategoriesItems}" 
      Rows="{Binding Path=PagerTableCategoriesRows}" 
      Columns="{Binding Path=PagerTableCategoriesColumns}" 
      SelectedEntry="{Binding Path=SelectedTableCategory, Mode=TwoWay}"> 
    </view:Pager> 
    ... 
</Page> 

MainPageViewModel.cs

using System.Collections; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Media; 
using Client.Model; 

namespace Client.ViewModel 
{ 
    public class MainPageViewModel : ViewModelBase 
    { 
     ... 
     IPagableEntry _selectedTableCategory; 

     public IPagableEntry SelectedTableCategory 
     { 
      get 
      { 
       return _selectedTableCategory; 
      } 
      set 
      { 
       _selectedTableCategory = value; 
       MessageBox.Show("Got it!"); 
      } 
     } 
     ... 
    } 
} 

我做了一個自定義面板 '尋呼機',這就是視圖模型。 ,我想在我的MainPage中顯示尋呼機。 我期望我選擇一個項目,然後MainPageViewModel的屬性SelectTableCategory將會改變,並且一個消息框顯示爲字符串「Got it!」 但它不起作用... 我的問題是什麼?

ps。我不擅長英語。 我希望你的理解。

+1

您的'SelectedEntry'屬性應該知道關於您的View Model的** nothing **。因此,使用'DataContext'通過依賴項屬性返回視圖模型中的屬性當然不是實現此目的的最佳方法。自定義依賴項屬性不需要依賴作爲特定視圖模型類型的'DataContext'。 **編輯**標準的依賴屬性應該可以解決這個問題。只需輸入'propdp' - > Tab - > Tab,Visual Studio會爲您提供一個。 –

回答

0

讓我們從第一原則開始工作。

你有一個叫做尋呼機的自定義控制,這是要使用這樣

<view:Pager x:Name="pagerTableCategories" 
     SelectedEntry="{Binding Path=SelectedTableCategory, Mode=TwoWay}"> 
</view:Pager> 

見SelectedEntry是如何分配的綁定?這告訴我們Pager必須實現SelectedEntry作爲依賴屬性。我們如何做到這一點?

public class Pager 
{ 
    // Using a DependencyProperty as the backing store for PrePend. 
    // This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty SelectedEntryProperty = 
     DependencyProperty.Register("SelectedEntry", typeof(object), 
      typeof(Pager), 
      new PropertyMetadata(null, OnSelectedEntryChanged)); 

    public object SelectedEntry 
    { 
     get { return GetValue(SelectedEntryProperty); } 
     set { SetValue(SelectedEntryProperty, value); } 
    } 

    private static void OnSelectedEntryChanged(DependencyObject pager, DependencyPropertyChangedEventArgs e) 
    { 
     // TODO set the SelectedItem in the ListBox 
    } 
} 

接下來你需要顯示尋呼機。你的XAML看起來不錯。您應該在ListBox上添加一個事件處理程序來偵聽選擇已更改的事件。這樣,當發生這種情況時,您可以更新SelectedEntry

public class Pager 
{ 
    // continued... 

    // *Updated* 
    private listBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     this.SelectedEntry = (sender as ListBox).SelectedItem; 
    } 
} 
+0

非常感謝!但是,如何在列表框中設置項目?該方法(OnSelectedEntryChanged)是靜態的,但列表框不是這樣,我不能訪問靜態方法中的列表框。 –

+0

我是這樣做的: (pager as Pager).listBoxEntries.SelectedItem = e.NewValue; 但MainPageViewModel中的SelectedTableCategory的set屬性尚未自動調用... –

+0

修復了listBox_SelectionChanged中的錯誤 –

相關問題