簡體   English   中英

在列表框中獲取復選框的IsChecked屬性

[英]Getting IsChecked Property of a CheckBox in a ListBox

找到這么多例子,不適合! 我的列表框是結果對象的列表。 可以在列表框中選中或取消選中結果,以將其標記為“允許發送”。

<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;
            }
        }

感謝您的關注。

使用MVVM始終檢查以下內容:

  1. using System.ComponentModel;添加using System.ComponentModel; 到您的ViewModelClass
  2. 繼承自INotifyPropertyChanged
  3. 始終檢查您的DataContext並查看BindingErrors的“ Output窗口
  4. 創建這樣的綁定:

示例屬性:

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

然后在MainViewModel上,例如在和ButtonClick上,您可以像下面這樣獲取所選文件:

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

注意:

FileListSelectedListBox的DataContext的屬性,該屬性與條目的DataContext不同(或至少應該如此)。

FileListSelected然后將返回ItemsSource的選定Item。

也許您可以通過選擇行/復選框來對此問題發表評論,並添加一些詳細信息,以便為您提供更多幫助。

編輯:通知MainWindowViewModel有關CheckBox狀態更改:

我在這里看到兩種可能的方法:

使用事件

將此添加到您的TestResult類:

public delegate void CheckBoxStateChangedHandler(object sender, CheckBoxStateChangedEventArgs e);

public event CheckBoxStateChangedHandler CheckBoxStateChanged;

public class CheckBoxStateChangedEventArgs
{
    bool CheckBoxChecked { get; set; }        
}

確保在MainViewModel創建新的TestResult ,您已訂閱該event

testResult.CheckBoxStateChanged += CheckBox_StateChanged;

CheckBox_StateChanged更改狀態后,處理要執行的操作。 請注意,參數e包含布爾值(已檢查)和相應的TestResult作為發送者。

您只需在CheckBox.Checked Binding的Setter中調用新事件:

public bool Checked
{
    get { return _checked; }
    set
    {
        _checked = value;
        OnPropertyChanged();
        CheckBoxStateChanged.Invoke(this, new CheckBoxStateChangedEventArgs() { CheckBoxChecked = value })            
    }
}

MAINWINDOWVIEWVIEWL上的呼叫方法

為此,您需要o創建MainWindowViewModelstatic對象(在MainViewModel中)-創建MainWindowViewModel不要忘記分配一個值。

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);            
    }
}
Internal Class TestResult
{
  ...
  private bool _canUpload;
  public bool CanUpload
  {
    get { return _canUpload; }
    set
    {
      _canUpload = value;
      base.RaisePropertyChanged("CanUpload");
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM