gpt4 book ai didi

wpf - 属性更改后 DataTrigger 未重新评估

转载 作者:行者123 更新时间:2023-12-03 17:20:58 27 4
gpt4 key购买 nike

【原创】
我有一个 ListBox有它的ItemsSource (这是在创建窗口时在后面的代码中完成的)数据绑定(bind)到 ObservableCollection . ListBox然后有以下DataTemplate根据项目分配:

用户控件.xaml

<ListBox x:Name="communicatorListPhoneControls"
ItemContainerStyle="{StaticResource templateForCalls}"/>

应用程序.xaml
<Style x:Key="templateForCalls" TargetType="{x:Type ListBoxItem}">  
<Setter Property="ContentTemplate" Value="{StaticResource templateRinging}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=hasBeenAnswered}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource templateAnswered}"/>
</DataTrigger>
</Style.Triggers>
</Setter>
</Style>

ObservableCollection用一个对象更新,这出现在 ListBox使用正确的首字母 DataTemplate ,但是当 hasBeenAnswered属性设置为 true (调试时我可以看到集合是正确的) DataTrigger不重新评估然后更新 ListBox使用正确的 DataTemplate .

我已经实现了 INotifyPropertyChanged我的对象中的事件,如果在模板中绑定(bind)到一个值,我可以看到值更新。只是 DataTrigger不会重新评估并更改为正确的模板。

我知道 DataTrigger绑定(bind)是正确的,因为如果我关闭窗口并再次打开它,它将正确应用第二个数据模板,因为 hasBeenAnswered设置为 true .

[编辑 1]
根据 Timores 的评论,我尝试了以下方法:

用户控件.xaml
<ListBox x:Name="communicatorListPhoneControls"
ItemTemplate="{StaticResource communicatorCallTemplate}"/>`

应用程序.xaml:
<DataTemplate x:Key="communicatorCallTemplate">
<Label x:Name="test">Not answered</Label>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=hasBeenAnswered}" Value="True">
<Setter TargetName="test" Property="Background" Value="Blue"/>
</DataTrigger>
</DataTemplate.Triggers>
</Label>
</DataTemplate>

现在发生的情况与第一个示例类似,当“未接听”标签显示来电时(每个调用存在一个,因为这是一个列表框 - 通常当窗口加载时不会有调用),然后调用回答和属性(property) hasBeenAnswered设置为 true,但“未回答”保持不变。如果我关闭窗口,然后再次重新打开它(事件调用仍将属性 hasBeenAnswered 设置为 true),则背景为蓝色。所以在我看来,数据触发器根本没有运行,直到窗口重新运行。

最佳答案

在示例中,我觉得奇怪的是您使用的是 ItemContainerStyle 而不是 ItemTemplate。

ItemContainerStyle 适用于包含 ItemsSource 中每个元素的 ListBoxItem。 ListboxItem 没有 hasBeenAnswered属性,所以我看不到绑定(bind)是如何工作的。

我建议为列表框中的数据类型创建一个 DataTemplate,并使用触发器进行与 templateAnswered 中相同的更改。风格。

编辑:在 OP 使用 ItemTemplate 的建议之后。

我试图重现这个例子,它对我来说很好。
这是我的 XAML(请忽略样式,这只是一个示例):



无解答








    <ListBox x:Name="communicatorListPhoneControls" 
ItemTemplate="{StaticResource communicatorCallTemplate}"/>

<Button Margin="0,20,0,0" Click="OnToggleAnswer" Content="Toggle answer status" />
</StackPanel>

在代码隐藏中:
public partial class Window1 : Window {

public Window1() {
InitializeComponent();

List<PhoneCall> lpc = new List<PhoneCall>()
{new PhoneCall(), new PhoneCall(), new PhoneCall(), new PhoneCall()};

communicatorListPhoneControls.ItemsSource = lpc;
}

private void OnToggleAnswer(object sender, RoutedEventArgs e) {

object o = communicatorListPhoneControls.SelectedItem;

if (o != null) {

PhoneCall pc = (PhoneCall) o;
pc.hasBeenAnswered = ! pc.hasBeenAnswered;
}
}
}

public class PhoneCall : INotifyPropertyChanged {

private bool _answered;


public bool hasBeenAnswered {
get { return _answered; }
set {
if (_answered != value) {
_answered = value;
FirePropertyChanged("hasBeenAnswered");
}
}
}

private void FirePropertyChanged(string propName) {

if (PropertyChanged != null) {

PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}

您能否尝试重现此内容并与您的代码进行比较?
注意:赋予 PropertyChanged 的​​属性名称中的最小错误可以解释您的行为。触发器可能基于正确的属性,但通知的名称可能拼写错误。

关于wpf - 属性更改后 DataTrigger 未重新评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2432513/

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