我已经创建了一个包含项目列表的列表框,我需要在选择更改(选择和取消选择)时绑定它们。
ABCD.xalm
<ListBox Grid.Column="2" Grid.ColumnSpan="9" Height="30" Margin="0 0 5 0" Foreground="{StaticResource AcresTheme}" SelectedItem="{Binding Path=UpdateSimulationItem,UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding SmulationTypes, NotifyOnSourceUpdated=True}"
Background="{Binding }"
MinHeight="65" SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Foreground="{StaticResource AcresTheme}"
Content="{Binding Item}"
IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"></CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
biao c.cs(查看模型)
public List<string> SimulationTypesList { get; set; } = new List<string>();
private ObservableCollection<SimulationType> _simulationTypes = new ObservableCollection<SimulationType>();
public ObservableCollection<Items> SimulationTypes
{
get
{
return _simulationTypes;
}
set
{
_simulationTypes = value;
OnPropertyChanged("SimulationTypes");
}
}
private Items _updateSimulationItem;
public Items UpdateSimulationItem
{
get
{
return _updateSimulationItem;
}
set
{
//Logic for getting the selected item
_updateSimulationItem = value;
OnPropertyChanged("UpdateSimulationItem");
}
}
public ABCD()
{
SimulationTypes.Add(new SimulationType() { Item = "Simulation 1", IsSelected = false });
SimulationTypes.Add(new SimulationType() { Item = "Simulation 2", IsSelected = false });
SimulationTypes.Add(new SimulationType() { Item = "Simulation 3", IsSelected = false });
}
Items.cs
public class Items: ViewModelBase
{
private string item;
public string Item
{
get { return item; }
set
{
item = value;
this.OnPropertyChanged("Item");
}
}
private bool isSelected;
public bool IsSelected
{
get { return isSelected; }
set
{
isSelected = value;
this.OnPropertyChanged("IsSelected");
}
}
}
我确实尝试了https://stackoverflow.com/a/34632944/12020323中给出的解决方案,这对于删除单个项目或选择单个项目来说效果很好。
当我们选择第二项时,它不会触发属性更改。
2条答案
按热度按时间ddrv8njm1#
错误不在此代码中。您可能对VM示例感到困惑。这是初学者经常遇到的情况。可能SimulationType的实现有问题。您没有显示它。
下面是一个完整的代码示例,演示了多选绑定是否正常工作。
第一个
也许您的意思是,在多重选择模式下,SelectedItem属性始终只有第一个被选择的项,直到取消选择它为止?
不幸的是,实现这样的任务并不容易,最好是定制一个AP属性,然后在XAML中使用。
第一次
k4aesqcs2#
谢谢你@EldHasp,花时间回答我的问题。非常感谢提供的解决方案。
目前我对ViewModel中的完整代码很感兴趣,我发现了我在ViewModel中所做的错误。
旧代码:
**_更新模拟项=值;**将第一个选定项绑定到UpdateSimulationItem,只有在更改特定项时才会触发propertychange。
例如:
添加新的模拟类型();添加新的模拟类型();添加新的模拟类型();
在这三个项目中,如果我选择Simulation 1,则UpdateSimulationItem将绑定到Simulation 1,并且propertychange将缩小到一个项目,即Simulation 1。现在,如果我们单击Simulation 2,则不会触发peopertychange,因为UpdateSimulationItem仅绑定到Simulation 1项目更改。
我所做的改变。
更新代码:
因为我们已经将SimulationTypes绑定到ABC.XAML中的ItemSource,如下所示
当我点击视图中的复选框时,它会自动更新SimulationTypes,因为我已经将复选框绑定到IsSelected。
@EldHasp我们必须在您的代码中做的代码更改是删除setter属性中对_selectedItem的赋值,只保留OnPropertychange(nameOf(SelectedItem))。
公共项目?选择的项目{ get =〉_selectedItem;设置=〉Set(引用所选项目,值);}粗体文本使SelectedItem绑定到一个项目,这在选择其他项目时限制触发器。
再次感谢您@EldHasp在此抽出时间。