2016-01-21 64 views
1

我發現了很多關於如何將WPF複選框的IsChecked屬性綁定到布爾屬性(如果屬於相同的Window類。我想要做不同的事情:如何將WPF複選框的IsChecked屬性綁定到非窗口對象的布爾屬性

我有主窗口(節選):

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private readonly SoundFx _soundFx = new SoundFx(); 

    private void _StartNewGame() 
    { 
     _soundFx.GameStarted(); 
    } 
} 

然後我有SoundFx類(節選):

public class SoundFx : DependencyObject 
{ 
    public void GameStarted() 
    { 
     if (Enabled) 
     { 
      _PlayGameStartedSound(); 
     } 
    } 

    public bool Enabled 
    { 
     get { return (bool) GetValue(EnabledProperty); } 
     set { SetValue(EnabledProperty, value); } 
    } 
    public static readonly DependencyProperty EnabledProperty = 
     DependencyProperty.Register("Enabled", typeof(bool), 
      typeof(SoundFx), new UIPropertyMetadata(false)); 

} 

和我有XAML (摘錄):

<Grid> 
    <CheckBox IsChecked="{Binding ElementName=_soundFx, Path=Enabled}" x:Name="checkBoxSoundFx" Content="Sound FX" HorizontalAlignment="Right" Margin="0,0,10,10" VerticalAlignment="Bottom"/> 
</Grid> 

說實話,我是新來的WPF,並不確切知道我在做什麼。我試圖實現的是當用戶點擊checkBoxSoundFx元素時,_soundFx.Enabled的值將被更改,而不使用任何事件處理程序,如CheckedUnchecked。這應該可以與數據綁定,不是嗎?

回答

2

首先,你需要創建

public SoundFx _soundFx { get; set; } 

爲公共財產,因爲你不能綁定到私人領域

public MainWindow() 
{ 
    InitializeComponent(); 
    _soundFx = new SoundFx(); 
} 

而且從XAML需要綁定,如:

<CheckBox IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window},Path=_soundFx.Enabled}"}" x:Name="checkBoxSoundFx" Content="Sound FX" HorizontalAlignment="Right" Margin="0,0,10,10" VerticalAlignment="Bottom"/> 
+0

非常感謝!你介意爲什麼解釋我的工作原理嗎?您的XAML對我來說是完全不可理解的。 –

+0

@Kimmy在xaml中,我們找到窗口並綁定到這個窗口屬性,你可以閱讀關於RelativeSource的內容,當你的控件的DataContext與你的窗口不同並且你想綁定到窗口的屬性時,它非常有用 – Jamaxack

+0

Oh man,was I一月份沒有經驗的回來!同時,我當然會決定使用MVVM模式來解決這個問題,而不是綁定到有時會發生在這裏的屬性,有時恰好在那裏。 –

0

你很近,你需要綁定一個屬性,如果你沒有這樣做,你需要設置DataContext:

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     this.DataContext = this; 
     InitializeComponent(); 
    } 

    private readonly SoundFx _soundFx = new SoundFx(); 
    public SoundFx {get {return _soundFx;}} 

    private void _StartNewGame() 
    { 
     _soundFx.GameStarted(); 
    } 
} 

然後需要綁定到這個屬性(將模式設置爲OneWayToSource如果你只需要設置屬性,從來沒有根據屬性值更新複選框):

<Grid> 
    <CheckBox IsChecked="{Binding Path=SoundFx.Enabled, Mode=OneWayToSource}" x:Name="checkBoxSoundFx" Content="Sound FX" HorizontalAlignment="Right" Margin="0,0,10,10" VerticalAlignment="Bottom"/> 
</Grid> 

通過我不知道爲什麼你的SoundFx是一個DependencyObject,爲什麼你的Enabled屬性是一個DependencyProperty。在這個特定的例子中,一個簡單的屬性也會起作用。

當您想要在樣式中設置它們或使用Storyboard爲它們設置動畫時,DependencyProperties非常有用,例如,您似乎不是這種情況。我認爲SoundFx應該繼承DependencyObject並且Enabled應該是一個簡單的屬性(這是我對你的項目知之甚少的看法)。

相關問題