C# 如何绑定WPF复选框';s已将属性选中为非窗口对象的布尔属性
我发现了很多关于如何将WPF复选框的IsChecked属性绑定到布尔属性(如果两者属于同一窗口类)的示例。我想做另一件事: 我有主窗口(摘录): 然后是SoundFx课程(摘录): 我有XAML(摘录):C# 如何绑定WPF复选框';s已将属性选中为非窗口对象的布尔属性,c#,wpf,xaml,checkbox,data-binding,C#,Wpf,Xaml,Checkbox,Data Binding,我发现了很多关于如何将WPF复选框的IsChecked属性绑定到布尔属性(如果两者属于同一窗口类)的示例。我想做另一件事: 我有主窗口(摘录): 然后是SoundFx课程(摘录): 我有XAML(摘录): 老实说,我是WPF的新手,不知道自己在做什么。我试图实现的是,当用户单击checkBoxSoundFx元素时,\u soundFx.Enabled的值可以更改,而无需使用任何事件处理程序,如Checked或Unchecked。数据绑定应该可以做到这一点,不是吗?首先需要创建 public
老实说,我是WPF的新手,不知道自己在做什么。我试图实现的是,当用户单击
checkBoxSoundFx
元素时,\u soundFx.Enabled
的值可以更改,而无需使用任何事件处理程序,如Checked
或Unchecked
。数据绑定应该可以做到这一点,不是吗?首先需要创建
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"/>
您很接近,您需要绑定到一个属性,如果您没有这样做,则需要设置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,切勿根据属性值更新复选框):
顺便说一下,我不知道为什么SoundFx是DependencyObject,为什么Enabled属性是DependencyProperty。在这个特定的示例中,一个简单的属性也可以工作
DependencyProperties在您希望在样式中设置它们或使用故事板设置它们的动画时非常有用。例如,在本例中,您似乎没有这样做。我认为SoundFx应该继承DependencyObject,而Enabled应该是一个简单的属性(尽管我对您的项目知之甚少)。与此同时,我在WPF方面积累了更多的经验,现在我想说我的问题本身是错误的。为了避免绑定中的混乱和视图和模型之间不必要的依赖关系,我现在总是希望在这种情况下使用MVVM
示例:非常感谢您!你能给我解释一下为什么会这样吗?您的XAML对我来说是完全不可理解的。@Kimmy在XAML中,我们找到了窗口并绑定到此windows属性,您可以阅读关于RelativeSource的内容,当您的控件的DataContext与您的windows不同并且您想绑定到窗口的属性时,它非常有用哦,伙计,我在一月份还没有体验过!同时,我当然会决定使用MVVM模式来解决这个问题,而不是绑定到有时在这里,有时在那里的属性。
public MainWindow()
{
InitializeComponent();
_soundFx = new SoundFx();
}
<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"/>
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();
}
}
<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>