【问题标题】:Yet another databinding issue in silverlightSilverlight 中的另一个数据绑定问题
【发布时间】:2011-08-02 15:28:08
【问题描述】:

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

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;
}

谁能解释一下为什么视图模型和用户控件之间的绑定不起作用?

【问题讨论】:

  • PageSourceSize的声明是什么?
  • 查看代码在我看来,我看到了 2 个 PageSize 属性:一个在 MyViewModel 类中,另一个在 MyDataPager 中。数据绑定值绑定到 MyDataPager 的属性,但在代码的最新行中,您更改了 MyViewModel 的属性。不是吗?
  • @Tigran 我已经更新了我的代码,很抱歉造成混乱。现在应该更清楚了。
  • @Anders 完成了。感谢您的支持。

标签: c# silverlight-4.0 mvvm


【解决方案1】:

查看代码,您似乎在不同 类中定义了不止一个PageSize 属性。而且很可能,仅通过查看提供的代码很难理解,您在XAML 中绑定一个属性,而是更改另一个属性的值。更改PageSize 属性之一的名称,以确保确切 数据绑定将读取/写入的位置。

我认为这应该会有所帮助。

【讨论】:

  • 抱歉给您带来了困惑(和语法:p),我更新了我的问题。
【解决方案2】:

与我的一位同事合作,我们找到了我打算做的解决方案:

在 MyDataPager 用户控件的 Xaml 中:

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

使用 MyDataPager_Loaded 的这个定义:

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

从上面的代码中我们改变了 MyDataPager 用户控件的 ctor 以移除 datacontext 绑定:

public MyDataPager()
        {
            //DataContext = this;

通过这种方式,我可以像这样在主用户控件中绑定值:

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

所以绑定是基于子用户控件的属性,而不是它的控件(即:子控件的外观可以毫无问题地改变),并且子用户控件不必使用任何“已知”值主用户控件的数据上下文。

感谢您的阅读和支持,非常欢迎。我希望这些线路可以为另一个需要的人服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多