c# - una - Cómo hacer público un control en XAML para ser visto en otras clases
wpf c# ejemplos (2)
No haga que la casilla de verificación sea visible hacia el exterior, simplemente pase el estado actual de la casilla de verificación a la función o clase. También considere binding el valor de la casilla de verificación a una clase en el DataContext
, el acceso directo a los controles se puede evitar la mayor parte del tiempo en WPF, vea también el patrón MVVM .
Estoy trabajando en la aplicación wpf. Hice una casilla de verificación en el XAML, luego mi código llama a una función en una clase y en esta función hay una condición if en la que se comprueba si la casilla de verificación está marcada o no, pero no se ve en esta clase, entonces, ¿cómo hacer esto?
Muchas gracias
EDITAR:
Aquí están los pasos que hice: creé la clase ViewModel en el mismo proyecto de KinectSkeleton como se muestra: clase ViewModel:
public class ViewModel
{
public bool IsChecked { get; set; }
public bool is_clicked { get; set; }
}
y en el KinectSkeleton definí una propiedad como se muestra:
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);
}
}
y el código de la casilla de verificación y el botón en KinectWindow.xaml es:
<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" />
y en el KinectSkeleton donde quiero verificar el valor de la casilla de verificación escribo:
if (this.ViewModelH.IsChecked == false)
// if(f.is_chekced==false)
{
// do something
}
¿Ahora quiero saber qué escribir en el evento is_checked del checkbox y is_clicked del botón? También hay algo que falta en mis pasos anteriores, ya que siento que hasta ahora la propiedad del esqueleto kinect no está vinculada al valor is_checked de la casilla de verificación.
Usando el siguiente XML puede definir un control como un campo público en la clase para poder acceder a él desde otras clases:
<CheckBox x:Name="myCheckBox" x:FieldModifier="public" />
Ahora puedes acceder al campo directamente en el código:
if (win.myCheckBox.IsChecked.Value)
{
// ...
}
Sin embargo, estoy de acuerdo con HB, que usar el patrón MVVM es una mejor manera de hacerlo. Otras partes de su código no deben conocer su UI o acceder directamente a ella.
EDITAR:
Con el enfoque de MVVM, primero debe definir su clase de modelo de vista:
public class ViewModel
{
public bool IsChecked { get; set; }
}
A continuación, establece una instancia de esta clase como DataContext
:
- ya sea en código, por ejemplo, constructor de ventana:
public MyWindow() { InitializeComponent(); DataContext = new ViewModel(); }
- o en XAML, por ejemplo, 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>
Ahora puede vincular su CheckBox a una propiedad en ViewModel:
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" />
Todo lo que queda es pasar la instancia de ViewModel
a su función OnRender
. Se almacena en la propiedad DataContext
de su ventana.
EDIT 2:
BTW: Realmente deberías haber preguntado eso antes de aceptar la respuesta.
No estoy seguro de qué intentas intentar con la propiedad is_clicked
. Para establecer este indicador cuando se hace clic en el botón, necesita un 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;
}
}
Agrega una instancia de este comando a su modelo de vista:
public class ViewModel
{
public bool IsChecked { get; set; }
public bool IsClicked { get; set; }
public ICommand CalibrateCommand { get; set; }
public ViewModel()
{
CalibrateCommand = new CalibrateCommand(this);
}
}
Lo atas al botón así:
<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}" />
No es necesario que maneje ningún evento de CheckBox
y Button
, todo se maneja mediante el enlace.
Si agregó una propiedad de dependencia a KinectSkeleton
, debe vincularla al modelo de vista:
<kt:KinectSkeleton ViewModelH="{Binding}" />