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...

Author: lisp, 2009-05-15

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.

 44
Author: Carlo, 2018-06-17 15:09:37

Tens de tornar a tua bidireccional:

<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/>
 63
Author: Thomas Levesque, 2009-05-15 19:19:38
Olá, esta é a minha primeira vez. por favor, seja paciente.: minha resposta foi criar uma propriedade simples:
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());
    }
}
 9
Author: abraham camhy, 2018-06-17 14:00:54
Se tem a propriedade "Miproperty" na sua classe de dados, então liga-se o Isquecked assim.... (o conversor é opcional, mas às vezes você precisa disso)
<Window.Resources>
<local:MyBoolConverter x:Key="MyBoolConverterKey"/>
</Window.Resources>
<checkbox IsChecked="{Binding Path=MyProperty, Converter={StaticResource MyBoolConverterKey}}"/>
 4
Author: Muad'Dib, 2009-05-15 18:46:32

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.

Http://www.helplessautomation.com/2011/01/wpf-coding-mutually-exclusive-check-boxes-with-data-binding/

Espero que isso ajude.
 1
Author: ElMatador, 2011-01-24 00:55:23

Deve ser mais fácil do que isso. Basta usar:

<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" />
 1
Author: Tim W, 2014-06-11 20:27:43

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"));
            }
        }
    }
}
 1
Author: pjm, 2015-06-24 14:32:51