【问题标题】:Not able to bind dependency property无法绑定依赖属性
【发布时间】:2013-05-25 20:24:29
【问题描述】:

我有一个非常简单的 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 的实际值。

【问题讨论】:

  • 为什么您的Player 控件被声明为资源而不是窗口的一部分?
  • @AdiLester Player 不是控件,它只是一个包含属性的类。
  • 那么,为什么在 XAML 中需要它?您可以使用 Form.Value 简单地从代码隐藏中访问滑块的值。
  • @AdiLester 我知道,但我真的很想学习我以后制作的复杂应用程序的数据绑定和依赖属性。
  • 好吧,第一课:数据绑定在你实际使用资源之前不会发生——这就是你得到 value = 0 的原因。我认为如果你尝试这样做,你可以学得更好特定的而不是任意的测试。

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


【解决方案1】:

您可以轻松地在 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}"/>

【讨论】:

  • 看起来他是在尝试从 Slider 中设置 Player 的值,而不是反过来。
  • 我猜在双向绑定中并不重要。
【解决方案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>

【讨论】:

  • 我已经有 DependencyObject 作为基类,所以它不允许我有两个基类。但是其他答案很有效,无论如何都感谢您的帮助。
  • Control 派生自 DependencyObject,因此您可以直接派生自 Control
【解决方案3】:

尝试反转你的绑定:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2016-01-22
    • 2012-11-08
    • 2012-08-01
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多