在ListBox中获取CheckBox的IsChecked属性

时间:2017-01-11 13:38:58

标签: c# wpf mvvm

找到了很多例子而且都不合适!我的列表框是Result对象的列表。可以在列表框中选中或取消选中结果,将其标​​记为“允许传输”。

<ListBox
     x:Name="FileListBox"
     ItemsSource="{Binding TestResults}"
     ItemTemplate="{StaticResource FileListTemplate}"
     SelectionMode="Single"
     SelectedItem="{Binding FileListSelected}"
     Background="#FFFFFBE2" />

FileListTemplate

<DataTemplate x:Key="FileListTemplate">
    <Grid HorizontalAlignment="Stretch">
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width=".5*" />
            <ColumnDefinition Width=".3*" />
            <ColumnDefinition Width=".2*" />
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0"
                   Text="{Binding FileName}" />
        <TextBlock Grid.Column="1"
                   Text="Machine">
        </TextBlock>
        <CheckBox x:Name="UploadOK"
                Grid.Column="2"
                HorizontalAlignment="Right"
                IsChecked="{Binding CanUpload, Mode=TwoWay}" />
    </Grid>
</DataTemplate>

我拿出了很多格式化代码来减少混乱。因此,当选中(或未选中)复选框时,我需要将对象上的布尔值设置为true或false。但我不希望选择ListItem只是因为选中了复选框。当选择ListItem时会发生其他事情。这是代码。

    public TestResult FileListSelected
    {
        get
            {
                return selectedItem;
            }
            set
            {
                if (value == selectedItem)
                    return;
                selectedItem = value;                   
                if (!Workspaces.Any(p => p.DisplayName == value.FileName))
                {
                    this.DisplayTestResult(value as TestResult);
                }
                base.RaisePropertyChanged("FileListSelected");
            }
        }

这是我为Checkbox绑定的代码(尽管它不起作用)。

    public bool CanUpload
        {
            get { return selectedItem.CanUpload; }
            set
            {
                selectedItem.CanUpload = value;
            }
        }

我很感激你看这个。

2 个答案:

答案 0 :(得分:0)

使用MVVM时,请务必检查以下内容:

  1. using System.ComponentModel;添加到ViewModelClass
  2. 继承自INotifyPropertyChanged
  3. 请务必检查您的DataContext并查看Output
  4. BindingErrors窗口
  5. 像这样创建绑定:
  6. 示例属性:

    public string Example
    {
        get { return _example; }
        set
        {
            _example= value;
            OnPropertyChanged();                
        }
    }
    

    每次新值分配时,系统会自动拨打OnPropertyChanged(一旦从其他位置更改,就不会自动更新!)

    确保INotifyPropertyChanged的实施如下:

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

    为此你还需要using System.Runtime.CompilerServices;

    让代码正常运行的其他选项:

    1. 您的TestResults应为ObservableCollection<TestResult>
    2. TestResult应具有CanUploadFileName的属性,并且继承自INotifyPropertyChanged
    3. 然后在你的MainViewModel例如on和ButtonClick你可以得到这样的选定文件:

      private List<string> GetSelectedFiles()
      {
          return TestResults.Where(result => result.CanUpload == true).Select(r => r.FileName).ToList());
      }
      

      注意:

      FileListSelected是您ListBox的DataContext的属性,它与条目的DataContext不同(或至少应该是)。

      FileListSelected将返回ItemsSource的所选项目。

      也许您可以通过行选择/复选框检查对此问题发表评论并添加一些细节,以便我们为您提供更多帮助。

      编辑:通知MainWindowViewModel有关CheckBox状态更改的信息:

      我在这里看到两种可能的方法:

        

      使用活动

      将此添加到您的TestResult课程:

      public delegate void CheckBoxStateChangedHandler(object sender, CheckBoxStateChangedEventArgs e);
      
      public event CheckBoxStateChangedHandler CheckBoxStateChanged;
      
      public class CheckBoxStateChangedEventArgs
      {
          bool CheckBoxChecked { get; set; }        
      }
      

      确保在TestResult MainViewModel中创建新的event时,您订阅testResult.CheckBoxStateChanged += CheckBox_StateChanged; ;

      CheckBox_StateChanged

      e中更改状态后,处理您要执行的操作。请注意,参数TestResult包含布尔值(已选中)和对应的CheckBox.Checked Binding作为发件人。

      您只需在public bool Checked { get { return _checked; } set { _checked = value; OnPropertyChanged(); CheckBoxStateChanged.Invoke(this, new CheckBoxStateChangedEventArgs() { CheckBoxChecked = value }) } } 的设置器中调用新事件:

      static
        

      MAINWINDOWVIEWMODEL上的CALL方法

      为此您需要创建MainWindowViewModel的{​​{1}}对象(在您的MainViewModel中) - 在创建MainWindowViewModel后,不要忘记分配值。< / p>

      public static MainViewModel Instance { get; set; }
      

      然后根据需要添加一个公共方法:

      public void CheckBoxValueChanged(bool value, TestResult result)
      {
          //Do whatever
      }
      

      您也可以在调用上面的事件的同一地点打电话。

      public bool Checked
      {
          get { return _checked; }
          set
          {
              _checked = value;
              OnPropertyChanged();
              MainWindowViewModel.Instance.CheckBoxValueChanged(value, this);            
          }
      }
      

答案 1 :(得分:0)

Internal Class TestResult
{
  ...
  private bool _canUpload;
  public bool CanUpload
  {
    get { return _canUpload; }
    set
    {
      _canUpload = value;
      base.RaisePropertyChanged("CanUpload");
    }
  }
}