无法绑定依赖项属性

时间:2013-05-25 20:24:29

标签: c# .net wpf xaml data-binding

我有一个非常简单的WPF应用程序,它有一个滑块和一个按钮。 我试图将我的类中的一个属性绑定到滑块的值,并在单击按钮时在消息框中显示值。

我的Player类中有一个名为BattingForm的属性

<Window.Resources>

    <local:Player x:Key="_batsman" x:Name="_batsman"
                  BattingForm="{Binding Path=Value, ElementName=Form}">
    </local:Player>

</Window.Resources>

<Slider Maximum="1" LargeChange="0.25" Value="0.25" Name="Form"/>

在Player Class中,属性如下。

    public double BattingForm
    {
        get { return (double)GetValue(BattingFormProperty); }
        set { SetValue(BattingFormProperty, value); }
    }

    public static readonly DependencyProperty BattingFormProperty =
        DependencyProperty.Register("BattingForm", typeof(double), typeof(Player));

在buttonclick事件中的MainWindow.xaml.cs中,我尝试按如下方式访问它 -

        Player batsman = FindResource("_batsman") as Player;
        if(batsman!=null)
        {
           MessageBox.Show(batsman.BattingForm.ToString());
        }

在MessageBox中它只显示0,而不是Slider的实际值。

3 个答案:

答案 0 :(得分:2)

Player控件在实际使用之前不会发生数据绑定。目前,您只声明了_batsman资源但尚未实际使用它。

正如你所说,你只是为了测试而这样做,最简单的方法是从可以在XAML中使用的基类派生Player,如Control

public class Player : Control

然后你就可以在XAML中做到这一点:

<StackPanel>
    <Slider Maximum="1" LargeChange="0.25" Value="0.25" Name="Form"/>

    <local:Player x:Name="_batsman"
                  BattingForm="{Binding Path=Value, ElementName=Form}" />
</StackPanel>

答案 1 :(得分:2)

您可以轻松地在Slider上声明绑定而不是Player资源:

<Window.Resources>
    <local:Player x:Key="batsman" BattingForm="0.25"/>
</Window.Resources>
<Grid>
    <Slider Maximum="1" LargeChange="0.25"
            Value="{Binding BattingForm, Source={StaticResource batsman}}"/>
</Grid>

这是有效的,因为Slider的Value属性默认绑定为双向。如果不这样做,则必须明确设置TwoWay模式:

<Slider Maximum="1" LargeChange="0.25"
        Value="{Binding BattingForm, Source={StaticResource batsman}, Mode=TwoWay}"/>

答案 2 :(得分:2)

尝试撤消绑定:

<Window.Resources>
    <local:Player x:Key="_batsman" BattingForm="0.25" />
</Window.Resources>
<Grid>
    <StackPanel>
        <Slider Maximum="1.0" LargeChange="0.25" Value="{Binding BattingForm, Source={StaticResource _batsman}}" />
        <!-- Included for testing -->
        <TextBox Text="{Binding BattingForm, Source={StaticResource _batsman}}" />
    </StackPanel>
</Grid>