Ligação à opção WPF
Embora seja trivial guardar o estado assinalado de uma opção numa variável usando o evento do botão do rato, como o faria através de uma base de dados? Todos os exemplos que encontrei têm a interface atualizada de algum datasource, ou ligam um controle a outro; eu quero atualizar uma variável de membro quando a opção for clicada.
TIA para quaisquer indicações...
7 answers
Você precisa de uma propriedade de dependência para isto:
public BindingList<User> Users
{
get { return (BindingList<User>)GetValue(UsersProperty); }
set { SetValue(UsersProperty, value); }
}
public static readonly DependencyProperty UsersProperty =
DependencyProperty.Register("Users", typeof(BindingList<User>),
typeof(OptionsDialog));
Assim que isso estiver feito, você liga a opção à propriedade de dependências:
<CheckBox x:Name="myCheckBox"
IsChecked="{Binding ElementName=window1, Path=CheckBoxIsChecked}" />
Para isso funcionar, tem de nomear a sua janela ou o UserControl na sua marca de abertura, e usar esse nome no parâmetro ElementName.
Com este código, sempre que alterar a propriedade do lado do Código, irá alterar a caixa de texto. Além disso, sempre que assinalar/desligar a opção Texto, a propriedade de dependências irá mudar muito.
Editar:
Uma forma fácil de criar uma propriedade de dependência é escrevendo o propdp do excerto, que lhe dará o código geral das propriedades de Dependência.
Todo o código:
XAML:
<Window x:Class="StackOverflowTests.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" x:Name="window1" Height="300" Width="300">
<Grid>
<StackPanel Orientation="Vertical">
<CheckBox Margin="10"
x:Name="myCheckBox"
IsChecked="{Binding ElementName=window1, Path=IsCheckBoxChecked}">
Bound CheckBox
</CheckBox>
<Label Content="{Binding ElementName=window1, Path=IsCheckBoxChecked}"
ContentStringFormat="Is checkbox checked? {0}" />
</StackPanel>
</Grid>
</Window>
C#:
using System.Windows;
namespace StackOverflowTests
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public bool IsCheckBoxChecked
{
get { return (bool)GetValue(IsCheckBoxCheckedProperty); }
set { SetValue(IsCheckBoxCheckedProperty, value); }
}
// Using a DependencyProperty as the backing store for
//IsCheckBoxChecked. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsCheckBoxCheckedProperty =
DependencyProperty.Register("IsCheckBoxChecked", typeof(bool),
typeof(Window1), new UIPropertyMetadata(false));
public Window1()
{
InitializeComponent();
}
}
}
Repare como o único código atrás é a propriedade de Dependência. Tanto o rótulo como a caixa de cheques estão ligados a ele. Se a opção mudar, a etiqueta também muda.
Tens de tornar a tua bidireccional:
<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/>
public bool Checked { get; set; }
Depois, para definir o contexto de dados da opção (chamada cb1):
cb1.DataContext = this;
Então para ligar a sua Proerty Isquecked no xaml
IsChecked="{Binding Checked}"
O código é assim:
XAML
<CheckBox x:Name="cb1"
HorizontalAlignment="Left"
Margin="439,81,0,0"
VerticalAlignment="Top"
Height="35" Width="96"
IsChecked="{Binding Checked}"/>
Código atrás
public partial class MainWindow : Window
{
public bool Checked { get; set; }
public MainWindow()
{
InitializeComponent();
cb1.DataContext = this;
}
private void myyButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(Checked.ToString());
}
}
<Window.Resources>
<local:MyBoolConverter x:Key="MyBoolConverterKey"/>
</Window.Resources>
<checkbox IsChecked="{Binding Path=MyProperty, Converter={StaticResource MyBoolConverterKey}}"/>
Aqui está um post que mostra um exemplo de ligação de dados simples a uma propriedade Isquecada de duas opções, que se excluem mutuamente.
Espero que isso ajude.Deve ser mais fácil do que isso. Basta usar:
<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" />
Isto funciona para mim (o código essencial só está incluído, preencha mais para as suas necessidades):
No XAML é definido um controlo do utilizador:
<UserControl x:Class="Mockup.TestTab" ......>
<!-- a checkbox somewhere within the control -->
<!-- IsChecked is bound to Property C1 of the DataContext -->
<CheckBox Content="CheckBox 1" IsChecked="{Binding C1, Mode=TwoWay}" />
</UserControl>
Em código atrás para o UserControl
public partial class TestTab : UserControl
{
public TestTab()
{
InitializeComponent(); // the standard bit
// then we set the DataContex of TestTab Control to a MyViewModel object
// this MyViewModel object becomes the DataContext for all controls
// within TestTab ... including our CheckBox
DataContext = new MyViewModel(....);
}
}
Algures na classe de solução, o MyViewModel está definido
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool m_c1 = true;
public bool C1 {
get { return m_c1; }
set {
if (m_c1 != value) {
m_c1 = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("C1"));
}
}
}
}