[英]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
始終檢查以下內容:
using System.ComponentModel;
添加using System.ComponentModel;
到您的ViewModelClass INotifyPropertyChanged
BindingErrors
的“ Output
窗口 示例屬性:
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;
使您的代碼正常工作的其他選項:
TestResults
應該是一個ObservableCollection<TestResult>
CanUpload
和FileName
的屬性,並繼承自INotifyPropertyChanged
然后在MainViewModel上,例如在和ButtonClick上,您可以像下面這樣獲取所選文件:
private List<string> GetSelectedFiles()
{
return TestResults.Where(result => result.CanUpload == true).Select(r => r.FileName).ToList());
}
注意:
FileListSelected
是ListBox
的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創建MainWindowViewModel
的static
對象(在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.