如何使用MVVM动态更新(绑定)ItemsControl中项目中的变量

编辑:这是我所做的更改,使其起作用:

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,并将触发器绑定到其StatusStatus"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}&#186;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(),我希望我的代码一次遍历每个项目,并将其背景更改为红色,然后又更改为白色。但是什么也没发生。

zzzyq 回答:如何使用MVVM动态更新(绑定)ItemsControl中项目中的变量

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3159962.html

大家都在问