2015-10-12 20 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中的错误 –

相关问题