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