我有一个带有以下绑定的ItemsControl:
ItemsControl ItemsSource="{Binding SelectedItems}
集合中有10个SelectedItem,每个都有一个带有此绑定的组合框:
ComboBox ItemsSource="{Binding SelectableItems}
选择SelectableItem时,将更新SelectedItems ObservableCollection。然后我想禁用SelectableItem,因此无法在任何其他组合框中选择它。
SelectableItems的数量不等于SelectedItems的数量。
我在ComboBoxItem上有以下样式:
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="IsEnabled" Value="{Binding IsSelectable}"/>
</Style>
这在启动时工作正常 - 但问题是因为我正在更新SelectedItems ObservableCollection,我没有更新SelectableItems集合..
有什么(LINQ?)我可以在SelectedItem.PropertyChanged事件中添加更新SelectableItems集合中的相关项 - 所以类似于:
public void SelectedItemObservableCollectionPropertyChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged("SelectableItem.IsSelectable");
}
如果没有,最好的解决方法是什么?
答案 0 :(得分:1)
我认为您需要为该特定类实现INotifyPropertyChanged,并且您需要在属性更改时进行通知。如果您需要更多说明,请告诉我。
答案 1 :(得分:0)
您的课程需要实施INotifyPropertyChanged:
class ClassA : INotifyPropertyChanged
{
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
if (value != _isEnabled)
{
_isEnabled = value;
OnPropertyChanged("IsEnabled");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
然后在您的selectItems的setter中包括:
OnPropertyChanged("SelectableItems");
(来自this answer)
答案 2 :(得分:0)
好的,所以我将SelectedItems ObservableCollection中的每个项目订阅到PropertyChanged事件,然后(回答问题)使用LINQ从SelectableItems ObservableCollection获取SelectableItem并设置属性:
public void SelectedItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
SelectedItem item = (SelectedItem)sender;
var selectableItem = (from SelectableItem in _selectableItems
where (SelectableItem.Name == item.Name)
select SelectableItem).First();
_selectableItems[selectableItem.Index].IsSelectable = false;
}
如果有更好的解决方案 - 请告诉我,谢谢。