web-dev-qa-db-ja.com

他のクラスで表示されるようにXAMLでコントロールをパブリックにする方法

私は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値にバインドされていないように感じるので、上記の手順に欠けているものはありますか?

27
Tak

次の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();
}
  • または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}" />
60
Damir Arh

チェックボックスを外部に表示しないでください。チェックボックスの現在の状態を関数またはクラスに渡してください。 bindingDataContext のクラスへのチェックボックス値も考慮してください。WPFではほとんどの場合、コントロールへの直接アクセスを回避できます。--も参照してください。 MVVMパターン

7
H.B.