一个绑定如何工作,而不是另一个?

时间:2012-03-16 16:39:04

标签: wpf devexpress

不确定它有多重要,但我正在使用devexpress网格并为其中一列定义一个celltemplate。问题是,当我使用“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是破坏的。这是一个经过验证的用户控制,它可以在许多其他数据中使用,这可能会影响到SCENARIOS。如果有任何错误的信息,那么它只会影响我在这个DATATEMPLATE中绑定的方式。谢谢。

以下是我在评级控件中定义依赖项属性的方法:

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 个答案:

答案 0 :(得分:2)

您必须使用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>

More about how to use RelativeSource

答案 1 :(得分:1)

根据您的上次更新,我猜是因为Slider默认为双向绑定而您的用户控件没有。尝试将Mode = TwoWay添加到绑定中:

<wpf:RatingControl RatingValue="{Binding RowData.Row.SetupRating, Mode=TwoWay}" MaxRating="3" />