35

我在 wpf 应用程序中工作我在 XAML 中创建了一个复选框,然后我的代码调用了一个类中的一个函数,并且在这个函数中有一个 if 条件,它检查复选框是否被选中但复选框没有看到在这个类中,那么如何做到这一点?

非常感谢

编辑:

以下是我所做的步骤: 我在 KinectSkeleton 的同一个项目下创建了 ViewModel 类,如图所示: ViewModel 类:

public class ViewModel
{
    public bool IsChecked { get; set; }
    public bool is_clicked { get; set; }
}

在 KinectSkeleton 中,我定义了一个属性,如下所示:

public static readonly DependencyProperty ViewModelProperty =
           DependencyProperty.Register("ViewModelH", typeof(ViewModel), typeof(KinectSkeleton), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
  

public ViewModel ViewModelH
{
    get => (ViewModel)GetValue(ViewModelProperty);
    set => SetValue(ViewModelProperty, value);
}

KinectWindow.xaml 中的复选框和按钮的代码是:

<Button Content="Calibrate" Height="24" x:Name="Calibrate" x:FieldModifier="public" Width="90" Click="Calibrate_Click" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Left" DockPanel.Dock="Left" Panel.ZIndex="0" Padding="0" VerticalAlignment="Center" />
<CheckBox IsChecked="{Binding Mode=TwoWay, Path=IsChecked}" Content="AngleDifference" Height="22" x:Name="AngleDifference" x:FieldModifier="public" Width="117" Checked="AngleDifference_Checked" Unchecked="AngleDifference_Unchecked" HorizontalAlignment="Left" VerticalAlignment="Center" Panel.ZIndex="1" HorizontalContentAlignment="Left" />

在我想检查我写的复选框的值的 KinectSkeleton 中:

    if (this.ViewModelH.IsChecked == false)
    // if(f.is_chekced == false)
    {
        // do something
    }

现在我想知道在复选框的 is_checked 事件和按钮的 is_clicked 中写什么?另外,我的上述步骤中是否缺少任何内容,因为我觉得到目前为止 Kinect 骨架属性未绑定到复选框 is_checked 值?

4

2 回答 2

71

使用以下 XML,您可以将控件定义为类上的公共字段,以便能够从其他类访问它:

<CheckBox x:Name="myCheckBox" x:FieldModifier="public" />

现在您可以直接在代码中访问该字段:

if (win.myCheckBox.IsChecked.Value)
{
    // ...
}

不过,我同意 HB 的观点,即使用 MVVM 模式是一种更好的方法。您的代码的其他部分不应该知道您的 UI 或直接访问它。

编辑:

使用 MVVM 方法,您应该首先定义您的视图模型类:

public class ViewModel
{
    public bool IsChecked { get; set; }
}

然后将此类的实例设置为DataContext

  • 在代码中,例如窗口构造函数:
public MyWindow()
{
    InitializeComponent();
    DataContext = new ViewModel();
}
  • 或在 XAML 中,例如 App.xaml:
<Application x:Class="WpfApplication2.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:WpfApplication2"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <vm:ViewModel x:Key="ViewModel" />
    </Application.Resources>
</Application>

现在您可以将 CheckBox 绑定到 ViewModel 中的属性:

<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" />

剩下的就是将ViewModel实例传递给您的OnRender函数。它存储在DataContext窗口的属性中。

编辑2:

顺便说一句:你真的应该在接受答案之前问这个问题。

我不确定您要对该is_clicked属性进行什么尝试。要在单击按钮时设置此标志,您需要Command

public class CalibrateCommand : ICommand
{
    private ViewModel viewModel;

    public CalibrateCommand(ViewModel viewModel)
    {
        this.viewModel = viewModel;
    }

    public void Execute(object parameter)
    {
        viewModel.IsClicked = true;
    }

    public bool CanExecute()
    {
        return true;
    }
}

您将此命令的一个实例添加到您的视图模型中:

public class ViewModel
{
    public bool IsChecked { get; set; }
    public bool IsClicked { get; set; }
    public ICommand CalibrateCommand { get; set; }

    public ViewModel()
    {
        CalibrateCommand = new CalibrateCommand(this);
    }
}

您将它绑定到按钮,如下所示:

<Button Content="Calibrate" Height="24" x:Name="Calibrate" x:FieldModifier="public" Width="90" Click="Calibrate_Click" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Left" DockPanel.Dock="Left" Panel.ZIndex="0" Padding="0" VerticalAlignment="Center" Command="{Binding CalibrateCommand}" />

您不需要处理CheckBox和 的任何事件Button,一切都由绑定处理。

如果你添加了一个依赖属性,KinectSkeleton你应该将它绑定到视图模型:

<kt:KinectSkeleton ViewModelH="{Binding}" />
于 2012-07-11T04:45:29.430 回答
7

不要使复选框对外部可见,只需将复选框的当前状态传递给函数或类。还可以考虑将复选框值绑定DataContext到 中的类,在 WPF 中大部分时间可以避免直接访问控件,另请参见MVVM 模式

于 2012-07-11T03:39:38.867 回答