및 컨트롤 중 하나가이처럼, 뷰 모델에서WPF MVVM 소스 만 업데이트되지 GUI
<ListView Grid.Row="5" Margin="0,5,0,0" ItemsSource="{Binding temps, Mode=TwoWay}"/>
업데이트, 나는
public class IndicatorLightVM:DependencyObject
{
/*---*/
public List<DataDev> temps { get; set;}
/*---*/
public IndicatorLightVM(IComm icomm, int moduleAddr = 1)
{
iComm = icomm;
pdm = new IndicatorLight(icomm, moduleAddr);
temps = pdm.DataDevs;
}
DataDevs이 특성으로 DataDev의 목록을 가지고 있으며, DataDev는
public abstract class DataDev: INotifyPropertyChanged
{
public int ModuleAddr { get; set; }
private double _value;
public double Value {
get
{
return _value;
}
set
{
_value = value;
OnPropertyChanged("Value");
}
}
/*---*/
}
가 그럼 난 Datadev의 값을 업데이트하는 방법을 호출 할 수 있습니다. 코드를 추적하면 값이 변경되지만 UI가 업데이트되지 않습니다.
public override CommResults ReadData()
{
channelselect = DataDevs.Count(d => d.isTest);
byte[] recvbuf = new byte[channelselect * 2+7];
byte[] sendbuf = new byte[7];
sendbuf[0] = Convert.ToByte(ModuleAddr % 256);
sendbuf[1] = 0X07;
sendbuf[2] = 0X07;
sendbuf[3] = BoolsToBytes()[0];
sendbuf[4] = 0X00;
CommResults result = GetCommData(sendbuf, recvbuf, channelselect * 2+7);
if (result != CommResults.OK)
{
return result;
}
AnalyseData(recvbuf);
return CommResults.OK;
}
private void AnalyseData(byte[] recvbuf)
{
for (int i = 0; i < channelselect; i++)
{
byte ss = Convert.ToByte(recvbuf[i * 2 + 6] & 0xF8);
if (Convert.ToInt32(ss) == 0xF8)
{
DataDevs.Where(x=>x.isTest).ToArray()[i].Value = (-((256 - recvbuf[i * 2 + 6]) * 256 - recvbuf[i * 2 + 5]) * 0.0625);
}
else if (Convert.ToInt32(ss) == 0)
{
DataDevs.Where(x => x.isTest).ToArray()[i].Value = ((recvbuf[i * 2 + 6] & 7) * 256 + recvbuf[i * 2 + 5]) * 0.0625;
}
}
}
코드가 누락되었습니다.
'그렇다면 Datadev의 가치를 업데이트하는 방법을 호출합니다 .' 어디입니까? 질문에 코드를 추가하십시오. – Blacktempel
왜 "View-Model"이'DependencyObject'에서 파생 되었습니까? INotifyPropertyChanged를 구현하는 추상 기본 클래스에서 파생되어야합니다. 다른 목록 개체와 교환 할 경우에 대비하여 목록에 알리미를 추가 할 수도 있습니다. – Blacktempel
UI가 'Value'속성에 어떻게 액세스합니까? 'DisplayMemberPath'가 보이지 않기 때문에'/ * --- * /'코드 부분에'ToString' 오버라이드가 있는지 모르겠습니다 ... – grek40