找到了很多例子而且都不合适!我的列表框是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;
}
}
我很感激你看这个。
答案 0 :(得分:0)
使用MVVM
时,请务必检查以下内容:
using System.ComponentModel;
添加到ViewModelClass INotifyPropertyChanged
Output
BindingErrors
窗口
示例属性:
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例如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");
}
}
}