设置
所以我有一个类,ComputerItem
,旨在存储我需要了解的有关特定计算机的所有信息;这些项目存储在一个ObservableCollection<ComputerItem>
. 然后我有一个自定义控件ComputerControl
,它(除其他外)有几个文本框绑定到 ComputerItem 的成员,绑定如下:
<TextBlock Name="tb_computerName"TextWrapping="Wrap" Text="{Binding ElementName=ComputerControl1, Path=computerName}"/>
在后面的代码中
public static DependencyProperty computerNameProperty = DependencyProperty.Register("computerName", typeof(string), typeof(ComputerControl), null);
然后我创建一个MultiselectList
ComputerControl 对象:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<toolkit:MultiselectList x:Name="lb_computers" IsSelectionEnabledChanged="lb_computers_IsSelectionEnabledChanged"> <!--SelectionChanged="lb_computers_SelectionChanged" >-->
<toolkit:MultiselectList.ItemTemplate>
<DataTemplate>
<StackPanel x:Name="sp">
<local:ComputerControl computerName="{Binding Name}" MACAddress="{Binding DisplayMAC}" playClicked="playClicked_Handler" editClicked="editClicked_Handler"/>
</StackPanel>
</DataTemplate>
</toolkit:MultiselectList.ItemTemplate>
</toolkit:MultiselectList>
</Grid>
您可以在 ComputerControl 定义中看到数据绑定。在后面的代码中,我将 ObservableCollection 绑定到 MultiselectList:
this.lb_computers.ItemsSource = ComputerListMaintainer.GetList();
并且所有这些(以及我确定我忘记包括在这里的一些东西)都可以很好地使用代表 ObservableCollection 中的 ComputerItems 的 ComputerControls 填充 MultiselectList。
问题
我的问题是,当底层 ComputerItem 更改时,相应 ComputerControl 中的 TextBlocks 不会更新。我INotifyPropertyChanged
在 ComputerItem 类中实现了:
public class ComputerItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string name;
protected virtual void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
public string Name
{
get { return name; }
set { OnPropertyChanged("Name"); name = value; }
}
}
但这并没有解决问题。我怀疑这与 ComputerControl 有关,但我不知道从哪里开始寻找;我发现的最接近的问题建议 INotifyPropertyChanged 应该是解决方案,但如果我没记错的话,在这种情况下他们没有使用自定义控件,只是一个自定义类。
我错过了什么?