编辑:这是我所做的更改,使其起作用:
public class MashStep : conductor<object>
{
private string _status;
public string Status
{
get
{
return _status;
}
set
{
_status = value;
NotifyOfPropertyChange(() => Status);
}
}
}
我想更新应用程序的UI,在其中使用ItemsControl
显示数据。创建BindingList
时,一切正常,并显示正确的数据,但是当我更改列表中某项的变量时,UI不会更新。
我正在尝试创建一个桌面应用程序,其中必须在UI中显示不同的步骤。为此,我将WPF与Caliburn.micro MVVM一起使用。
每个步骤都是MashStep
BindingList
中的项目MashList
。每个MashStep
由不同的变量组成,其中一个变量是名为Status
的字符串。我想做的是根据Status
的值动态地更改每个项目的背景。创建BindingList
时,我这样做很容易,但是当我更改Status
的值时,UI不会更新。
对于每个项目,我使用的是DataTemplate
,并将触发器绑定到其Status
。 Status
为"Running"
时,项目背景应为红色。其他任何状态都应为默认背景(白色)。
注意:用于更改UpdateStatus()
的值的方法Status
仅用于调试。
ViewModel中的代码:
public class MashStep
{
public string Status { get; set; }
}
public class SessionViewModel
{
private BindingList<MashStep> _mashList;
public BindingList<MashStep> MashList
{
get
{
return _mashList;
}
set
{
_mashList = value;
NotifyOfPropertyChange(() => MashList);
}
public SessionViewModel()
{
MashList.Add(new MashStep() { StepName = "Step 1",InputDur = 20,InputTemp = 30,Status = "Waiting"});
MashList.Add(new MashStep() { StepName = "Step 2",Status = "Waiting"});
}
private async void UpdateStatus()
{
foreach (var item in MashList)
{
item.Status = "Running";
NotifyOfPropertyChange(() => MashList);
await Task.Delay(2000);
item.Status = "Waiting";
}
}
}
视图中的代码:
<DataTemplate x:Key="MashStepTemplate">
<Border Padding="10" Background="White" Margin="0 5" x:Name="ItemContainerBorder" BorderBrush="LightGray" BorderThickness="1">
<StackPanel Orientation="Vertical">
<TextBlock FontWeight="SemiBold">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} @ {1}ºC">
<Binding Path="StepName"/>
<Binding Path="InputTemp"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text="Waiting" FontStyle="Italic"/>
<TextBlock Text="{Binding InputDur,StringFormat='Remaining: 00:{0}:00'}"/>
</StackPanel>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Status}" Value="Running">
<Setter TargetName="ItemContainerBorder" Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="Waiting">
<Setter TargetName="ItemContainerBorder" Property="Background" Value="White"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<ItemsControl ItemsSource="{Binding MashList}" ItemTemplate="{StaticResource MashStepTemplate}">
<ItemsControl.ItemsPanel>
<itemspaneltemplate>
<StackPanel Orientation="Vertical" IsItemsHost="True"/>
</itemspaneltemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
一旦我运行UpdateStatus()
,我希望我的代码一次遍历每个项目,并将其背景更改为红色,然后又更改为白色。但是什么也没发生。