gpt4 book ai didi

wpf - 列表框项目源不随源更新

转载 作者:行者123 更新时间:2023-12-03 10:29:55 27 4
gpt4 key购买 nike

我的 XAML 中有 2 个列表框,它们都是多选的。我已经使用 Samuel Jack's solution 同步了列表框的 selectedItems .

<ListBox x:Name="lbOrg" HorizontalAlignment="Left" Grid.Column="1" Grid.Row="0"
Margin="15,3,5,3" Width="200" Height="120" ItemsSource="{Binding AvailableOrg}"
LSync:MultiSelectorBehaviours.SynchronizedSelectedItems="{Binding SelectedOrg}"
SelectionMode="Extended" DisplayMemberPath="OrgShortName"/>


<ListBox x:Name="lbSite" HorizontalAlignment="Left" Grid.Column="3" Grid.Row="0"
Margin="15,3,5,3" Width="200" Height="120" ItemsSource="{Binding AvailableSites}"
LSync:MultiSelectorBehaviours.SynchronizedSelectedItems="{Binding SelectedSites}"
SelectionMode="Extended" DisplayMemberPath="SiteShortName"/>

网站 需要根据在 中选择的值进行填充磅 .因此,为了让 ViewModel 知道 的选择已更改磅 ,我正在处理 的选定项目列表的选择更改事件磅并调用一个方法来填充 的值网站 .
    public void Load()
{
_selectedOrg = new ObservableCollection<object>();
_selectedSites = new ObservableCollection<object>();

_selectedOrg.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_selectedOrg_CollectionChanged);
}

private void _selectedOrg_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (AvailableSites != null)
AvailableSites.Clear();

if(SelectedOrg != null && SelectedOrg.Count > 0)
{
foreach (object org in SelectedOrg)
{
if (AvailableSites == null || AvailableSites.Count == 0)
AvailableSites = WebClient.getSitesForOrg(((OrganizationModel)org).OrgId);
else
{
ObservableCollection<object> tempSiteList = WebClient.getSitesForOrg(((OrganizationModel)org).OrgId);
foreach (object site in tempSiteList)
{
AvailableSites.Add(site);
}
}
}
}
}

我已将属性定义为:
public ObservableCollection<object> SelectedOrg
{
get
{
return _selectedOrg;
}
set
{
_selectedOrg = value;
OnPropertyChanged("SelectedOrg");
}
}

public ObservableCollection<object> AvailableSites
{
get
{
return _availableSites;
}
set
{
_availableSites = value;
OnPropertyChanged("AvailableSite");
}
}

我的 ViewModelBase 实现了 INotifyPropertyChanged。 此外,属性被定义为 ObservableCollection,其中对象是从两个属性中的单独自定义类中转换而来的。

我想这应该很容易,但是由于某些奇怪的原因,列表框没有收到有关属性更改的通知,因此对源的更改没有反射(reflect)在 View 上。我已经在后面的代码中将一个 eventHandler 与 lbOrg 的 Selection changed 事件绑定(bind),以检查 lbSite 的 Itemssource 是否得到更新,但是尽管 AvailableSites 属性具有所需的值,但它并没有。

在这里的任何帮助将不胜感激。

最佳答案

你错过了一个“s”。 :)

OnPropertyChanged("AvailableSite");

应该
OnPropertyChanged("AvailableSites");

我的 ViewModelBase 中有一些代码在 Debug模式下检查字符串,这对于捕获此类错误非常有帮助:
[Conditional("DEBUG")]
private void CheckPropertyNameIsValid(string propertyName)
{
// INotifyPropertyChanged notifies via strings, so use
// this helper to check that the string is accurate in debug builds.
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
throw new Exception("Invalid property name: " + propertyName);
}

还有各种优雅的解决方案可以完全消除对 INotifyPropertyChanged 的魔弦的依赖。 ,但我还没有开始使用这些。

关于wpf - 列表框项目源不随源更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9886666/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com