2013-05-25 131 views
1

我有一個非常簡單的WPF應用程序,它有一個滑塊和一個按鈕。 我試圖將我的類中的一個屬性綁定到滑塊的值,並在單擊按鈕時在消息框中顯示值。無法綁定依賴項屬性

我有一個名爲BattingForm財產在我的Player類

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

和播放器類中,屬性如下。

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,而不是滑塊的實際值。

+0

爲什麼宣佈你的'Player'控制作爲一種資源,而不是作爲你窗戶的一部分? –

+0

@AdiLester Player不是一個控件,它只是一個具有屬性的類。 –

+0

在這種情況下,您爲什麼需要使用XAML?你可以簡單地通過'Form.Value'從代碼隱藏中訪問滑塊的值。 –

回答

2

您可以輕鬆地宣佈在滑塊上,而不是球員資源綁定:

<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屬性默認是雙向綁定的。如果不能做到這一點,你就必須明確地設置雙向模式:

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

看起來他試圖從Slider中設置玩家的價值,而不是相反。 –

+0

雙向綁定並不重要,我想。 – Clemens

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

我已經有了DependencyObject作爲基類,所以它不允許我有兩個基類。但其他答案的工作非常感謝,無論如何感謝幫助。 –

+0

'Control'從'DependencyObject'派生,所以你可以從'Control'派生。 –

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>