Еще одна проблема, связанная с данными в Silverlight - PullRequest
1 голос
/ 02 августа 2011

Я знаю, что эта тема обсуждалась, но пока не мной. Как я видел в других примерах по этой проблеме, я пытаюсь создать какой-то базовый кастом 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 ]

1 голос
/ 02 августа 2011

Глядя на код, кажется, что у вас есть более одного PageSize свойства, определенного в различных классах. И наиболее вероятно, что это трудно понять, просто взглянув на предоставленный код, вы связываете XAML одно свойство, но вместо этого изменяете значение другого. Измените имя одного из PageSize свойств, чтобы быть уверенным, где точно привязка данных собирается для чтения / записи.

Я думаю, это должно помочь.

0 голосов
/ 03 августа 2011

Работая с моим коллегой, мы нашли решение для того, что я намеревался сделать:

В Xaml пользовательского контроля MyDataPager:

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

, исходя из этого определения MyDataPager_Loaded:

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

Из приведенного выше кода мы изменили ctor пользовательского элемента управления MyDataPager, чтобы удалить привязку текста данных:

public MyDataPager()
        {
            //DataContext = this;

Работая таким образом, я могу связывать значения вОсновной usercontrol, например, такой:

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

Чтобы привязка выполнялась на свойствах childusercontrol, а не на его элементе управления (т. е. внешний вид дочернего элемента управления может меняться без проблем), и таким образом дочерний элемент usercontrolне нужно использовать какие-либо «известные» значения из текстового контекста основного пользовательского элемента управления.

Спасибо за чтение и за вашу поддержку, это было очень приветствовано. Я надеюсь, что эти строки могут служить другим, нуждающимся в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...