Как сделать контроль в общедоступном 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">
<p>и в KinectSkeleton, где я хочу проверить значение флажка, которое я пишу:</p>
<pre class="prettyprint linenums"> if (this.ViewModelH.IsChecked == false)
 // if(f.is_chekced==false)
 {
 // do something
 }

теперь я хочу знать, что писать в is_checked событии флажка и is_clicked кнопки? также есть что-то, отсутствующее в моих предыдущих шагах, поскольку я чувствую, что до сих пор свойство kinect skeleton не привязано к флажку is_checked value?

2 ответа

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

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

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

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

EDIT:

С помощью подхода MVVM вы должны сначала определить класс модели представления:

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

Затем вы устанавливаете экземпляр этого класса как DataContext:

  • либо в коде, например. конструктор окна:
<pre class="prettyprint linenums">public MyWindow() { InitializeComponent(); DataContext = new ViewModel(); } </pre>
  • или в XAML, например. App.xaml:
<pre class="prettyprint linenums"><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"> </vm:viewmodel></application.resources> </application> </pre>

Теперь вы можете привязать свой CheckBox к свойству в ViewModel:

Все, что осталось, - передать экземпляр 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}">
<p>Вам не нужно обрабатывать какие-либо события <code>CheckBox</code> и <code>Button</code>, все обрабатывается привязкой.</p>
<p>Если вы добавили свойство зависимостей в <code>KinectSkeleton</code>, вы должны привязать его к модели представления:</p>
</button>


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

licensed under cc by-sa 3.0 with attribution.