Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a control in XAML public in order to be seen in other classes

I'm working in wpf application i made a checkbox in the XAML, then my code calls a function in a class and in this function there is an if condition where its checking on whether the checkbox is checked or not but the checkbox is not seen in this class, so how to do this?

Many thanks

EDIT:

Here are the steps I did: I created the ViewModel class under the same project of KinectSkeleton as shown: ViewModel class:

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

and in the KinectSkeleton I defined a property as shown:

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); } 

and the code of the checkbox and button in the KinectWindow.xaml is:

<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" /> 

And in the KinectSkeleton where I want to check the value of the checkbox I write:

    if (this.ViewModelH.IsChecked == false)     // if(f.is_chekced == false)     {         // do something     } 

now I want to know what to write in the is_checked event of the checkbox and is_clicked of the button? also, is there anything missing in my above steps as I feel that till now the Kinect skeleton property is not bound to the checkbox is_checked value?

like image 874
Tak Avatar asked Jul 11 '12 03:07

Tak


People also ask

How can I access a control in WPF from another class or window?

Access of the controls from within the same assembly is hence allowed. If you want to access a control on a wpf form from another assembly you have to use the modifier attribute x:FieldModifier="public" or use the method proposed by Jean.

How do I navigate from one XAML window to another in WPF?

NavigationService is for browser navigation within WPF. What you are trying to do is change to a different window TrainingFrm . To go to a different window, you should do this: private void conditioningBtn_Click(object sender, RoutedEventArgs e) { var newForm = new TrainingFrm(); //create your new form.


2 Answers

Using the following XML you can define a control as a public field on the class to be able to access it from other classes:

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

Now you can access the field directly in code:

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

I agree with H.B., though, that using the MVVM pattern is a better way to do it. Other parts of your code shouldn't be aware of your UI or directly access it.

EDIT:

With the MVVM approach you should first define your view model class:

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

Then you set an instance of this class as DataContext:

  • either in code, e.g. window constructor:
public MyWindow() {     InitializeComponent();     DataContext = new ViewModel(); } 
  • or in XAML, e.g. 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> 

Now you can bind your CheckBox to a property in ViewModel:

<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" /> 

All that's left is to pass the ViewModel instance to your OnRender function. It is stored in the DataContext property of your window.

EDIT 2:

BTW: You really should have asked that before you accepted the answer.

I'm not sure what you are trying to attempt with the is_clicked property. To set this flag when the button is clicked, you need a 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;     } } 

You add an instance of this command to your view model:

public class ViewModel {     public bool IsChecked { get; set; }     public bool IsClicked { get; set; }     public ICommand CalibrateCommand { get; set; }      public ViewModel()     {         CalibrateCommand = new CalibrateCommand(this);     } } 

You bind it to the button like 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}" /> 

You don't need to handle any events of the CheckBox and the Button, everything is handled by the binding.

If you added a dependency property to KinectSkeleton you should bind it to the view model:

<kt:KinectSkeleton ViewModelH="{Binding}" /> 
like image 132
Damir Arh Avatar answered Oct 09 '22 03:10

Damir Arh


Don't make the checkbox visible to the outside, just pass the current state of the checkbox to the function or class. Also consider binding the checkbox value to a class in the DataContext, directly accessing controls can be avoided most of the time in WPF, see also the MVVM pattern.

like image 21
H.B. Avatar answered Oct 09 '22 01:10

H.B.