Silverlight中的另一个数据绑定问题

时间:2011-08-02 15:28:09

标签: c# silverlight-4.0 mvvm

我知道这个话题已经讨论过,但我还没有讨论过。正如我在其他关于此问题的示例中看到的那样,我正在尝试创建一些基本的自定义DataPager UserControl。所以我做了以下事情:

XAML:

 <ComboBox Name="Size"  ItemsSource="{Binding PageSourceSize}"  
                      SelectedValue="{Binding PageSizePager}"  />

使用以下C#:

ObservableCollection<int> _PageSourceSize;

public ObservableCollection<int> PageSourceSize
    {
        get { return _PageSourceSize; }
        set
        {
            _PageSourceSize = value;
            RaisePropertyChanged("PageSourceSize");
        }
    }

public MyDataPager()
{
     DataContext = this;
     PageSizePager = 10;
     PageSourceSize = new ObservableCollection<int>() { 10, 20, 50,100 };
}


public int PageSizePager
{
    get { return (int)GetValue(PageSizePagerProperty); }
    set { SetValue(PageSizePagerProperty, value); }
}

public static readonly DependencyProperty PageSizePagerProperty =
    DependencyProperty.Register("PageSizePager", typeof(int), typeof(MyDataPager), new PropertyMetadata(10));

从这里开始,我打算在主UserControl中使用我的寻呼机:

 <local:MyDataPager  PageSizePager="20" x:Name="MyDataPager1" />

这样可以正常使用,但我希望使用以下内容从viewModel获取值

<local:MyDataPager  PageSizePager="{Binding Path=PageSize,Mode=TwoWay}" x:Name="MyDataPager1" />

视图模型:

public int PageSize
{
  get { return (int)GetValue(PageSizeProperty); }
  set { SetValue(PageSizeProperty, value); }
}

public static readonly DependencyProperty PageSizeProperty =
            DependencyProperty.Register("PageSize", typeof(int), typeof(ViewSchedeConsuntiviViewModel), new PropertyMetadata(10));


public MyViewModel()
{
  PageIndex = 1;
  PageSize = 20;
}

有人可以解释为什么视图模型和用户控件之间的绑定不起作用吗?

2 个答案:

答案 0 :(得分:1)

查看代码,您似乎在不同的类中定义了多个PageSize属性。最可能的是,通过查看提供的代码很难理解,您在XAML一个属性中绑定,而是更改另一个属性的值。改变其中一个PageSize属性的名称,以确定完全数据绑定将在何处进行读/写。

我认为这应该有所帮助。

答案 1 :(得分:0)

与我的一位同事合作,我们找到了一个解决方案,我想做什么:

在MyDataPager usercontrol的Xaml中:

<Grid x:Name="LayoutRoot" Background="White" Loaded="MyDataPager_Loaded">
....

使用MyDataPager_Loaded的这个定义:

void MyDataPager_Loaded(object sender, RoutedEventArgs e)
        {
            ((Grid)sender).DataContext = this;
        }

从上面的代码中我们更改了MyDataPager usercontrol的ctor以删除datacontext绑定:

public MyDataPager()
        {
            //DataContext = this;

以这种方式工作,我能够在主用户控件中绑定值,如下所示:

<local:MyDataPager  PageSizePager="{Binding Path=PageSize,Mode=TwoWay}" x:Name="MyDataPager1" />

因此,绑定是基于childusercontrol的属性,而不是它的控制(即:子控件的外观可能没有问题地改变),以便子用户控件不必使用来自的任何“已知”值主用户控件的datacontext。

感谢您的阅读和支持,我们非常欢迎。我希望这些专栏能够满足另一个需要的人。