gpt4 book ai didi

c# - 如何在自定义控件中获取数据绑定(bind)文本 block 以进行更新?

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

设置

所以我有一个类,ComputerItem ,旨在存储我需要了解的有关特定计算机的所有信息;这些项目存储在 ObservableCollection<ComputerItem> .然后我有一个自定义控件 ComputerControl ,其中(除其他外)有几个文本框绑定(bind)到 ComputerItem 的成员,绑定(bind)如下:

<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 定义中看到数据绑定(bind)。在后面的代码中,我将 ObservableCollection 绑定(bind)到 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 应该是解决方案,但如果我没记错的话,在这种情况下他们没有使用自定义控件,只是一个自定义类。

我错过了什么?

最佳答案

好吧,您的二传手不适合初学者;还请查看 MvvmLight,因为它为此类管道工作提供了出色的 API。

public string Name
{
get { return name; }
set
{
if(value != name)
{
name = value;
OnPropertyChanged("Name");
}
}
}

更新:

您不应该在后面的代码中设置 lb_computers.ItemsSource,因为这是一次性操作而不是绑定(bind)。最好绑定(bind)到可观察对象的 ObservableCollection(又名 INotifyPropertyChanged)。

另外我不确定您是否正确声明了依赖属性,因此您可以在下面找到有关如何定义“可绑定(bind)”属性的正确设置。

此外,对于 XAML,代码的体系结构很重要,以获得理智的体验。我强烈建议您使用 Mvvm 模式。我发现 MvvmLight 和 MEFedMVVM 对我的开发很有帮助。这需要在开始时做一些工作,但调试 future 的问题和维护代码会容易得多。

如果这些提示没有帮助,那么我必须查看您的完整代码。

声明可绑定(bind)属性
#region ReportName

public string ReportName
{
get { return (string)GetValue(ReportNameProperty); }
set { SetValue(ReportNameProperty, value); }
}

public static readonly DependencyProperty ReportNameProperty = DependencyProperty.Register("ReportName",
typeof(string), typeof(ExportableGridView), new PropertyMetadata("Report", new PropertyChangedCallback(OnReportNameChanged)));

public static void OnReportNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
ExportableGridView control = sender as ExportableGridView;
control.titleTextBlock.Text = e.NewValue as string;
}

#endregion ReportName

关于c# - 如何在自定义控件中获取数据绑定(bind)文本 block 以进行更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10213402/

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