私は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
{
return (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値にバインドされていないように感じるので、上記の手順に欠けているものはありますか?
次のXMLを使用すると、他のクラスからアクセスできるように、クラスのパブリックフィールドとしてコントロールを定義できます。
<CheckBox x:Name="myCheckBox" x:FieldModifier="public" />
コードでフィールドに直接アクセスできるようになりました。
if (win.myCheckBox.IsChecked.Value)
{
// ...
}
しかし、私はH.B.に同意します。ただし、MVVMパターンを使用する方がより良い方法です。コードの他の部分では、UIを認識したり、UIに直接アクセスしたりしないでください。
編集:
MVVMアプローチでは、最初にビューモデルクラスを定義する必要があります。
public class ViewModel
{
public bool IsChecked { get; set; }
}
次に、このクラスのインスタンスをDataContext
として設定します。
public MyWindow() { InitializeComponent(); DataContext = new ViewModel(); }
<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}" />
チェックボックスを外部に表示しないでください。チェックボックスの現在の状態を関数またはクラスに渡してください。 bindingDataContext
のクラスへのチェックボックス値も考慮してください。WPFではほとんどの場合、コントロールへの直接アクセスを回避できます。--も参照してください。 MVVMパターン 。