如何正确绑定Checkbox属性

时间:2019-01-07 14:51:33

标签: c# wpf checkbox

我正在处理wpf应用程序,现在正在处理复选框 像这样将Ischecked属性设置为“ True”时出现的问题:

   <CheckBox  Visibility="{Binding checkVisibility}" IsChecked="true" 
   IsEnabled="True"></CheckBox>

我的复选框已选中 但是,当我尝试绑定其值为“ true”的booléan属性时,我的复选框始终未选中 我看不到问题所在

这是我的xaml

 <CheckBox  Visibility="{Binding checkVisibility}" IsChecked="{Binding Path=test,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" IsEnabled="True"></CheckBox>

这是我的财产

public bool _test = true;

public bool test {
    get {
        return _test;
    }
    set {
        if (_test == value) {
            return;
        }

        _test = value;
        RaisePropertyChanged("test");
    }
}

我希望我的复选框反映我的财产价值,反之亦然,但事实并非如此,因为我的复选框始终未选中 我想念什么吗?

修改 这是我的虚拟机:

namespace X{
public class MyViewModel :  
{ 
public MyViewModel()
{
  TestCheckbox();
}
#Region Properties

    public bool _test1 = true;
    public bool test1
    {
        get
        {
            return _test1;
        }

        set
        {
            if (_test1 == value)
            {
                return;
            }

            _test1 = value;
            RaisePropertyChanged("test1");
        }
    }

 ObservableCollection<Output> _output_List;
    public ObservableCollection<Output> output_List
    {
        get { return _output_List; }
        set
        {
            if (_output_List == value) return;
            _output_List = value;
            RaisePropertyChanged("output_List");
        }

    }
#EndRegion
#Region ButtonCommand
  private RelayCommand _SetOutputPropertiesCommand;

    public RelayCommand SetOutputPropertiesCommand => _SetOutputPropertiesCommand
                ?? (_SetOutputPropertiesCommand = new RelayCommand(
                () =>
                {   
                        foreach (Output item in output_List)
                        {
                          item.myvalue=Test2;
                        }
                    }

                }));

#EndRegion
#Region Method
  public void TestCheckbox()
    {
     Console.Writeline(Test2);
    }
#EndRegion    

            }
  public class Output
{
    public string label { get; set; }
    public string type { get; set; }
    public bool myvalue { get; set; }
    public bool Test2 { get; set; }
    [System.ComponentModel.DataAnnotations.Schema.NotMapped]
    [JsonIgnore]
    public string checkVisibility { get; set; }
}
}

我的Xaml:我的复选框集成在DataGrid视图中

                    <DataGrid x:Name ="GridO"  Style="{x:Null}"
                    ItemsSource= "{Binding output_List,UpdateSourceTrigger=PropertyChanged}"

                  AutoGenerateColumns="False" CellStyle="{StaticResource Body_Content_DataGrid_Centering}"
                  Margin="5,0" IsReadOnly="True" SelectionMode="Single" RowHeight="50" Height="Auto">


                        <DataGrid.Columns>

                            <DataGridTextColumn Width="40*" Binding="{Binding label}">
                                <DataGridTextColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock  Text="Input"></TextBlock>
                                    </DataTemplate>
                                </DataGridTextColumn.HeaderTemplate>
                            </DataGridTextColumn>

                            <DataGridTextColumn  Width="40*" Binding="{Binding type}">
                                <DataGridTextColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock  Text = "Type"></TextBlock>
                                    </DataTemplate>
                                </DataGridTextColumn.HeaderTemplate>
                            </DataGridTextColumn>


                            <DataGridTemplateColumn Width="20*" >
                                <DataGridTemplateColumn.Header>
                                    <TextBlock Text="Value" />
                                </DataGridTemplateColumn.Header>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                            <CheckBox Margin="20,0,0,0" Visibility="{Binding checkVisibility }" IsChecked="{Binding Test2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsEnabled="True"></CheckBox>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                        </DataGrid.Columns>
                    </DataGrid>
   <Button x:Name="Valid_output" Cursor="Hand" Background="Transparent"  Height="55"  Width="140" Margin="0,0,20,0" Command="{Binding SetOutputPropertiesCommand}"  >

绑定正在与“ Test2”一起使用,而不与与“ Test2”不在同一类中的“ Test1”一起使用 注意: Button命令(与“ Test1”处于同一类)效果很好

我的DataTemplate:在App.xaml中

  xmlns:v="clr-namespace:X.View"
  xmlns:vm="clr-namespace:X"
   <DataTemplate DataType="{x:Type vm:MyViewModel}">
            <v:MyWindow/>

2 个答案:

答案 0 :(得分:0)

我在DataGrid中看到了主要问题。您将ItemsSource设置为一个集合,因此对于DataGrid中的每一行,数据源都是该集合中的一项。不是您的MyViewModel

这就是Test2起作用的原因-集合中的实例在类中。

您可以尝试将CheckBox添加到不带DataGrid的窗口中并绑定Test1-应该可以。

如果您确实想使用MyViewModel中的某些属性,可以,但是并不是那么容易。您必须有类似的东西:

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:YourNamespace"

<!--...something...-->

<DataGrid.Resources>
   <local:BindingProxy x:Key="Proxy" Data="{Binding}" />
</DataGrid.Resources>

<!--...something...-->

然后您在DataGrid中的绑定将如下所示:

IsChecked="{Binding Data.Test1, Source={StaticResource Proxy}}"

我当然不知道您的应用程序的确切设置,因此您将不得不根据它们完成/更改代码。

答案 1 :(得分:-2)

我建议您添加一个ViewModelBase类

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = 
    null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

使用此ViewModelBase类扩展ViewModel并实现您的属性

private bool myProperty;

public bool MyProperty { get; set; OnPropertyChanged(); }

然后,您只需要绑定属性即可

<CheckBox IsChecked="{Binding MyProperty}"></CheckBox>

编辑: :要将ViewModel设置为View的DataContext,可以通过代码进行设置

MyView.DataContext = new MyViewModel();

或从视图中,在“窗口/用户控件”中

<Window x:Class="MyApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyApplication"
    Title="MainWindow" Height="350" Width="525"
    DataContext="local.MyViewModel">