Как может работать один переплет, но не другой? - PullRequest
1 голос
/ 16 марта 2012

Не уверен, насколько это важно, но я использую сетку devexpress и определяю шаблон ячейки для одного из столбцов.Проблема в том, что когда я связываюсь с «slidercontrol», это работает, но когда я связываюсь с UserControl моего собственного создания, связывание не работает.UserControl связывается правильно ... Я использую его в другом месте кода.Это просто не работает в этом контексте, и мне интересно, почему?Спасибо.

Эта привязка работает:

<dxg:GridColumn FieldName="SetupRating" Header="Setup Rating" AllowFocus="True" AllowEditing="True">
                <dxg:GridColumn.CellTemplate>
                    <DataTemplate>
                        <Slider Value="{Binding RowData.Row.SetupRating}" Minimum="0" Maximum="3" />           
                    </DataTemplate>
                </dxg:GridColumn.CellTemplate>
</dxg:GridColumn>

Эта привязка не работает:

<dxg:GridColumn FieldName="SetupRating" Header="Setup Rating" AllowFocus="True" AllowEditing="True">
                <dxg:GridColumn.CellTemplate>
                    <DataTemplate>
                        <wpf:RatingControl RatingValue="{Binding RowData.Row.SetupRating}" MaxRating="3" />
                    </DataTemplate>
                </dxg:GridColumn.CellTemplate>
 </dxg:GridColumn>

Редактировать: ПОЖАЛУЙСТА, НЕ ПРЕДЛАГАЙТЕ, ЧТО wpf: RatingControl IS BROKEN.Это проверенный пользовательский контроль, который работает во многих других сценариях связывания данных.Если с ним что-то не так, у него должно быть что-то неясное, что только влияет на путь, который я связываю с этим шаблоном данных.СПАСИБО.

Вот как я определяю свойство зависимостей в моем элементе управления рейтингом:

public static readonly DependencyProperty RatingValueProperty =
        DependencyProperty.Register("RatingValue", typeof(int), typeof(RatingControl),
                                    new FrameworkPropertyMetadata(0,
                                                                  FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                                                                  RatingValueChanged));

    public int RatingValue
    {
        get 
        { 
            return AdjustRatingValue((int)GetValue(RatingValueProperty), MaxRating); 
        }
        set
        {
            SetValue(RatingValueProperty, AdjustRatingValue(value, MaxRating));
        }
    }

    private static int AdjustRatingValue(int value, int maxValue)
    {
        if (value < 0)
            return 0;
        else if (value > maxValue)
            return maxValue;
        else
            return value;
    }
    private static void RatingValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        RatingControl parent = sender as RatingControl;
        int numberOfButtonsToHighlight = AdjustRatingValue((int)e.NewValue, parent.MaxRating);

        SelectStars(numberOfButtonsToHighlight, parent.StarValues); 
    }

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Вы должны использовать RelativeSource, чтобы найти родительский элемент, что-то вроде этого

<dxg:GridColumn FieldName="SetupRating" Header="Setup Rating" AllowFocus="True" AllowEditing="True">
                <dxg:GridColumn.CellTemplate>
                    <DataTemplate>
                        <wpf:RatingControl RatingValue="{Binding DataContext.RowData.Row.SetupRating, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dxg:GridColumn}}}" MaxRating="3" />
                    </DataTemplate>
                </dxg:GridColumn.CellTemplate>
 </dxg:GridColumn>

Подробнее об использовании RelativeSource

1 голос
/ 16 марта 2012

Исходя из вашего последнего обновления, я предполагаю, что это потому, что по умолчанию ползунок имеет двухстороннюю привязку, а ваш пользовательский элемент управления - нет.Попробуйте добавить Mode = TwoWay к вашей привязке:

<wpf:RatingControl RatingValue="{Binding RowData.Row.SetupRating, Mode=TwoWay}" MaxRating="3" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...