【发布时间】:2015-07-24 09:47:52
【问题描述】:
我在处理 MVVM 数据绑定问题。
在我的示例中,我有一个 ListView 填充项目,其中包含 CheckBox 和一些其他内容。
<ListView
Background="#f0f0f0"
Grid.Row="1"
ItemsSource="{Binding ListViewCollection}"
SelectedItem="{Binding SelectedItem}"
IsSynchronizedWithCurrentItem="True"
BorderThickness="0"
Margin="5">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox Tag="{Binding TheValue}" IsChecked="{Binding IsChecked}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding TheText}" Header="#Cell" />
<GridViewColumn DisplayMemberBinding="{Binding TheVoltage}" Header="U[V]" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
ListView 的 ItemSource 绑定到 ViewModel 中数据类的 ObservableCollection,就像在 MVVM 中一样。
现在我想将每个列表视图项的Checkbox.IsChecked 属性连接到父级ListView.SelectedItems 属性以触发它。为什么?因为我想显示/隐藏一系列数据图。因此,如果选中第一行中的 CheckBox,则显示图 1。如果未选中第二行中的 CheckBox,则隐藏图 2,依此类推。像这样的:
public ListViewItem SelectedItem
{
get { return mSelectedItem; }
set
{
if (mSelectedItem!= value)
{
mSelectedItem= value;
RaisePropertyChanged("SelectedItem");
if (SelectedItem.IsChecked == true)
{
OxyplotModel.Series[1].IsVisible = false;
OxyplotModel.InvalidatePlot(true);
}
}
}
}
要触发此属性,您必须在 GUI 中单击两次。首先检查CheckBox,然后再次单击该行以触发和隐藏图形。但我想在点击CheckBox 后立即触发SelectedItems 属性。
现在我将一个命令绑定到CheckBox 并传递一个参数来区分复选框。但正如我所说,我想使用该属性。
这是可能的还是有更好的想法来解决我的问题?
【问题讨论】:
-
当您使用绑定时,
ListView.SelectedItem不会是ListViewItem类型。它只是一个容器。它将与您的收藏中的项目具有相同的类型。因此,如果ItemsSource绑定到List<MyItemClass>则ListView.SelectedItem(s)将给出MyItemClass这应该是您绑定属性的类型 -
是的,我知道!但这不是我的问题。 SelectedItem 仅在单击行时触发,而不是在复选框上!我知道我必须将一个属性绑定到与 ItemSource 相同类型的 SelectedItem。我很清楚!
-
我知道这不是你的问题,因此只发表评论。据我了解,您的问题是
ListViewItem未被选中,因为CheckBox获得焦点。是否希望在单击CheckBox时选中ListViewItem? -
没错,这就是我想要的!!
-
我之前问过一个非常相似的问题,我认为我得到的解决方案比你得到的当前答案更简单stackoverflow.com/questions/15091716/…
标签: c# wpf listview mvvm data-binding