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)
{
    // ...
}

ただし、MVVM パターンを使用する方が良い方法であるという HB の意見には同意します。コードの他の部分は、UI を認識したり、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 に答える