2012-06-15 18 views
0

我在WPF C#项目中有一个CheckBoxes网格。每个复选框的Command属性绑定到一个CheckBoxChangedCommand我WView.xaml文件,像这样:在WPF中调用Command时从CheckBox获取Checked属性

<CheckBox Grid.Row="0" IsChecked="true" x:Name ="CheckBox0" 
      Command="{Binding CheckBoxChangedCommand}" /> 
<CheckBox Grid.Row="1" IsChecked="true" x:Name="CheckBox1" 
      Command="{Binding CheckBoxChangedCommand}" /> 

每次被选中或未选中,我叫CheckBoxChanged复选框之一。我将如何去显示一个弹出窗口,显示CheckBox的网格中的行号和CheckBox的名称(例如“CheckBox0”),以及2. Checked值(true/false)复选框?

我CheckBoxChangedCommand,在WViewModel.cs文件,如下所示:

public ICommand CheckBoxChangedCommand 
{ 
    get 
    { 
     return new RelayCommand(param => 
     { 
      MessageBox.Show("CheckBoxChanged!"); 
     }); 
    } 
} 

我如何可以访问IsChecked财产,引发了CheckBoxChangedCheckBoxChanged CheckBox的行号?我怎样才能将我的视图中的数据传递给ViewModel?

+1

是否有一个原因,你为什么不绑定IsCheck编辑属性到你的ViewModel,像这样:'IsChecked =“{Binding IsChecked}”;这将有利于您在用户更改复选框的状态时通知您并且您同时知道其值。 (如果每个复选框有一个ViewModel,效果最好。) – 2012-06-15 18:18:37

+0

我试着为我的3个CheckBoxes(1到X)中的每一个制作单独的'IsCheckedX'处理程序。如何获得IsCheckedX'内的CheckBox的当前状态?我尝试使用'IsChecked =“{Binding IsChecked2}”',其中'IsChecked2'是一个无效函数,只显示一个MessageBox,表示hello,但是当我检查并取消选中CheckBox 2时,此函数从不会被调用。 – mewsicalcat

+0

您无法绑定到一个方法; 'IsChecked2'必须是公共财产,例如'public bool IsChecked2 {get {...} set {...}}'。 – 2012-06-20 04:56:28

回答

1

你绝对需要在这里进行更多的绑定。

首先,您应该将Checkboxes的IsChecked属性绑定到viewmodel上的一个属性。其次,根据你的评论需要知道被选中的复选框的行号,我想说你可能需要通过数据绑定生成包含CheckBox的“行”,这样你才能通过表示该行作为CheckBoxChangedCommand的CommandParameter的对象。

因此,像:

<ListBox ItemsSource="{Binding MyItems}" /> 

,然后在你的资源:

<DataTemplate DataType="{x:Type local:MyItemType}"> 
    <CheckBox IsChecked="{Binding IsChecked}" 
       Command="{Binding CheckChangedCommand}" 
       CommandParameter="{Binding}" /> 
</DataTemplate> 

注:您的CheckChangedCommand可能是在主视图模型,而不是项目级视图模型,所以你可能需要做一些其他类型的查找,使其找到它 - 这个例子只是为了简单

相关问题