C# 属性更改后Template10 UI未刷新

C# 属性更改后Template10 UI未刷新,c#,mvvm,uwp,template10,C#,Mvvm,Uwp,Template10,我正在使用模板10开发UWP应用程序,在ViewModel中的属性更改后,我无法更新UI。我试图在模型上实现可绑定的基础,但仍然不起作用 XAML: 视图模型: public class RoomPageViewModel : ViewModelBase { Template10.Services.SerializationService.ISerializationService _SerializationService; private FileIOHelper.Fil

我正在使用模板10开发UWP应用程序,在ViewModel中的属性更改后,我无法更新UI。我试图在模型上实现可绑定的基础,但仍然不起作用

XAML:


视图模型:

public class RoomPageViewModel : ViewModelBase
{
    Template10.Services.SerializationService.ISerializationService _SerializationService;
    private FileIOHelper.FileIOHelper fileIOHelper = new FileIOHelper.FileIOHelper();
    private AppServiceConnection serialCommandService;

    // This method is called by the Set accessor of each property.
    // The CallerMemberName attribute that is applied to the optional propertyName
    // parameter causes the property name of the caller to be substituted as an argument.

    public RoomPageViewModel()
    {
        if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
        {
            Room = Room.CreateNewRoom();
        }
    }

    private Room room = Room.CreateNewRoom();
    public Room Room
    {
        get
        {
            return this.room;
        }

        set
        {
            Set(ref room, value);
        }
    }

    public void UpdateRoom()
    {
        foreach (var sensor in Room.Sensors)
        {
            var sensorValue = new SensorValue();
            sensorValue.Sensor = "R" + Room.Number + "D" + sensor.DeviceNumber + "S" + sensor.Type;
            ObservableCollection<SensorValue> newList = fileIOHelper.ReadFromFile(sensorValue).ToObservableCollection();
            SensorValue newSensorValue = newList.Last();
            sensor.SensorValues = new ObservableCollection<SensorValue> { newSensorValue };
        }
        foreach (var actuator in Room.Actuators)
        {
            var actuatorValue = ActuatorValue.CreateNewActuatorValue();
            actuatorValue.Actuator = "R" + Room.Number + "D" + actuator.DeviceNumber + "A" + actuator.Type;
            ObservableCollection<ActuatorValue> newList = fileIOHelper.ReadFromFile(actuatorValue).ToObservableCollection();
            ActuatorValue newActuatorValue = newList.Last();
            actuator.ActuatorValues = new ObservableCollection<ActuatorValue> { newActuatorValue };
        }
    }

    public async void RefreshButton_Click(object sender, object parameter)
    {
        Random rnd = new Random();
        Room = Room.CreateNewRoom(rnd.Next(1, 9));
        //UpdateRoom();
        await Task.CompletedTask;
    }
公共类RoomPageViewModel:ViewModelBase
{
Template10.Services.SerializationService.ISerializationService\u SerializationService;
private FileIOHelper.FileIOHelper FileIOHelper=new FileIOHelper.FileIOHelper();
私有AppServiceConnection serialCommandService;
//此方法由每个属性的集合访问器调用。
//应用于可选propertyName的CallerMemberName属性
//参数导致调用方的属性名被替换为参数。
公共RoomPageViewModel()
{
if(Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
Room=Room.CreateNewRoom();
}
}
私人房间=Room.CreateNewRoom();
公共房间
{
得到
{
把这个房间还给我;
}
设置
{
设置(参考房间、值);
}
}
公共无效更新eRoom()
{
foreach(房间内的var传感器。传感器)
{
var sensorValue=新的sensorValue();
sensorValue.Sensor=“R”+房间号+“D”+传感器号+“S”+传感器号+传感器类型;
ObservableCollection newList=fileIOHelper.ReadFromFile(sensorValue).ToObservableCollection();
SensorValue newSensorValue=newList.Last();
sensor.SensorValues=新的可观测集合{newSensorValue};
}
foreach(房间内的var执行器。执行器)
{
var actuatorValue=actuatorValue.CreateNewActuatorValue();
actuatorValue.Actuator=“R”+房间号+“D”+执行器.DeviceNumber+“A”+执行器.Type;
你知道为什么UI没有更新吗?谢谢。

大多数人(包括我自己)在习惯“旧的”
绑定时经常犯的一个错误是,
x:Bind
一次性
绑定作为默认绑定,而不是
单向
绑定

模式:将绑定模式指定为以下字符串之一:“OneTime”、“OneWay”或“TwoWay”。默认值为“OneTime”。请注意,这与{binding}的默认值不同,后者在大多数情况下为“OneWay”

资料来源:

要使绑定更新正常工作,您需要:

  • 使用
    INotifyPropertyChanged
    ,这由
    BindableBase
    处理
  • 设置正确的模式,例如

    Text=“{x:Bind ViewModel.Room.Number,Mode=OneWay}


进一步调查后,我发现问题可能是绑定必须是单向的,因为这不是默认值。我会在有时间的时候再试。谢谢你的帮助。现在主属性的更新可以工作了,尽管如果我在ObservableCollections的某个元素中更改了某些内容,它不会更新UI。st我的结构是:Room(Properties+Actuator ObservableCollection)=>Actuator(Properties+ActuatorStatus ObservableCollection)。虽然我在Actuator和ActuatorStatus模型中都实现了BindableBase,但UI没有得到更新。所有绑定现在都是单向的。出于某种原因,在ListView中,使用“{x:Bind xxx,Mode=OneWay}”“不允许更新UI,但是”{Binding xxx,Mode=OneWay}“工作非常完美。再次感谢您的帮助。@Carlos您可以重新设置x:bind行为吗?如果可以,请可靠地向我发送一个指向重新设置项目的链接,我将告诉团队。如果可以,请通过Microsoft.com向我发送电子邮件@Jerry.Nixon。”。
public class RoomPageViewModel : ViewModelBase
{
    Template10.Services.SerializationService.ISerializationService _SerializationService;
    private FileIOHelper.FileIOHelper fileIOHelper = new FileIOHelper.FileIOHelper();
    private AppServiceConnection serialCommandService;

    // This method is called by the Set accessor of each property.
    // The CallerMemberName attribute that is applied to the optional propertyName
    // parameter causes the property name of the caller to be substituted as an argument.

    public RoomPageViewModel()
    {
        if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
        {
            Room = Room.CreateNewRoom();
        }
    }

    private Room room = Room.CreateNewRoom();
    public Room Room
    {
        get
        {
            return this.room;
        }

        set
        {
            Set(ref room, value);
        }
    }

    public void UpdateRoom()
    {
        foreach (var sensor in Room.Sensors)
        {
            var sensorValue = new SensorValue();
            sensorValue.Sensor = "R" + Room.Number + "D" + sensor.DeviceNumber + "S" + sensor.Type;
            ObservableCollection<SensorValue> newList = fileIOHelper.ReadFromFile(sensorValue).ToObservableCollection();
            SensorValue newSensorValue = newList.Last();
            sensor.SensorValues = new ObservableCollection<SensorValue> { newSensorValue };
        }
        foreach (var actuator in Room.Actuators)
        {
            var actuatorValue = ActuatorValue.CreateNewActuatorValue();
            actuatorValue.Actuator = "R" + Room.Number + "D" + actuator.DeviceNumber + "A" + actuator.Type;
            ObservableCollection<ActuatorValue> newList = fileIOHelper.ReadFromFile(actuatorValue).ToObservableCollection();
            ActuatorValue newActuatorValue = newList.Last();
            actuator.ActuatorValues = new ObservableCollection<ActuatorValue> { newActuatorValue };
        }
    }

    public async void RefreshButton_Click(object sender, object parameter)
    {
        Random rnd = new Random();
        Room = Room.CreateNewRoom(rnd.Next(1, 9));
        //UpdateRoom();
        await Task.CompletedTask;
    }
public class Room : BindableBase
{
    private string name;
    private string image;
    private string type;
    private int number; 

    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            Set(ref name, value);
        }
    }

    public string Image
    {
        get
        {
            return image;
        }
        set
        {
            Set(ref image, value);
        }
    }

    public string Type
    {
        get
        {
            return type;
        }
        set
        {
            Set(ref type, value);
        }
    }

    public int Number
    {
        get
        {
            return number;
        }
        set
        {
            Set(ref number, value);
        }
    }

    private ObservableCollection<Sensor> sensors;

    private ObservableCollection<Actuator> actuators;

    public ObservableCollection<Sensor> Sensors
    {
        get
        {
            return sensors;
        }
        set
        {
            Set(ref sensors, value);
        }
    }

    public ObservableCollection<Actuator> Actuators
    {
        get
        {
            return actuators;
        }
        set
        {
            Set(ref actuators, value);
        }
    }

    public Room() {
        Random rnd = new Random();
        Name = "DefaultName";
        Image = "DefaultImage";
        Type = "DefaultType";
        Number = rnd.Next(1,9);
        Sensors = new ObservableCollection<Sensor>();
        Actuators = new ObservableCollection<Actuator>();
    }

    public Room(int inputNumber)
    {
        Name = "DefaultName";
        Image = "DefaultImage";
        Type = "DefaultType";
        Number = inputNumber;
        Sensors = new ObservableCollection<Sensor>();
        Actuators = new ObservableCollection<Actuator>();
    }

    public static Room CreateNewRoom(int inputNumber)
    {
        return new Room(inputNumber);
    }
}