Как сделать контроль в общедоступном XAML, чтобы его видели в других классах

Я работаю в приложении wpf, я установил флажок в XAML, тогда мой код вызывает функцию в классе, и в этой функции есть условие if, где проверяется, установлен ли флажок или нет, но флажок не видно в этом классе, так как это сделать?

Большое спасибо

ИЗМЕНИТЬ:

Вот шаги, которые я сделал: Я создал класс ViewModel в рамках того же проекта KinectSkeleton, как показано: Класс 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 skeleton не привязано к флажку is_checked value?

Ответы

Ответ 1

Используя следующий XML, вы можете определить элемент управления как общедоступное поле класса, чтобы иметь доступ к нему из других классов:

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

Теперь вы можете получить доступ к полю непосредственно в коде:

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

Я согласен с H.B., однако, что использование шаблона MVVM - лучший способ сделать это. Другие части вашего кода не должны знать о вашем пользовательском интерфейсе или напрямую обращаться к нему.

EDIT:

С помощью подхода 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}" />

Ответ 2

Не устанавливайте флажок снаружи, просто передайте текущее состояние флажка функции или класса. Также рассмотрите привязку к значению флажка к классу в DataContext, прямой доступ к элементам управления можно избежать большую часть времени в WPF, см. также шаблон MVVM.