C# 使用MVVM的用户控件绑定
为了理解UserControls的绑定,我目前正在进行不同的练习 我有以下用户控件:C# 使用MVVM的用户控件绑定,c#,wpf,mvvm,user-controls,C#,Wpf,Mvvm,User Controls,为了理解UserControls的绑定,我目前正在进行不同的练习 我有以下用户控件: <UserControl x:Class="Overvaagning.View.AccGyrValues" xmlns:vm="clr-namespace:Overvaagning.Model" mc:Ignorable="d" Width="404.478" Height="467.164"> <UserControl.DataContext>
<UserControl x:Class="Overvaagning.View.AccGyrValues"
xmlns:vm="clr-namespace:Overvaagning.Model"
mc:Ignorable="d" Width="404.478" Height="467.164">
<UserControl.DataContext>
<vm:Accelerometer/>
</UserControl.DataContext>
<Grid Margin="10,0,0,0">
<Label x:Name="labelValX" Content="{Binding Path=xValue}" HorizontalAlignment="Left" Margin="282,51,0,0" VerticalAlignment="Top" FontSize="30" RenderTransformOrigin="0.519,0.24" Width="88" Height="44"/>
</Grid>
和ViewModel:
public class Accelerometer : Values, INotifyPropertyChanged, Overvaagning.Model.Values.ISensorOperations
{
public SensorAccelerometer BTAccSensor { get; internal set; }
// Property changed event handleren initialiseres
public event PropertyChangedEventHandler PropertyChanged;
// Her initiliserer jeg Universalt Entydigt Identification (UUID) for at få adgang til Accelerometer tjenesten i kittet
static Guid SensorDeviceUuid = Guid.Parse("F000AA10-0451-4000-B000-000000000000");
public Accelerometer()
{
// Definer sensoren til en accelerometer sensor.
BTAccSensor = new SensorAccelerometer();
// Sensoren service UUID defineres til Accelerometer UUID.
BTAccSensor.SensorDeviceUuid = SensorDeviceUuid;
// Denne UUID er en karakteristisk UUID i accelerometer tjenesten der har opgaven til at aktivere accelerometeret
BTAccSensor.DataUuid = Guid.Parse("F000AA11-0451-4000-B000-000000000000");
// Denne UUID bruges til at konfigurere acceleromteret
BTAccSensor.ConfigurationUuid = Guid.Parse("F000AA12-0451-4000-B000-000000000000");
// Denne UUID bruges til at modificere acceleromter følsomheden, alt afhængig af, hvor mange notifikationer
// accelerometer skal sende pr. sekund
BTAccSensor.SpeedUuid = Guid.Parse("F000AA13-0451-4000-B000-000000000000");
// PropertyChanged defineres til den metode der skal kaldes, så snart der modtages data fra accelerometet
BTAccSensor.PropertyChanged += sensor_PropertyChanged;
}
public sbyte XRaw { get; internal set; }
public sbyte YRaw { get; internal set; }
public sbyte ZRaw { get; internal set; }
public byte ValueToSend;
public double X { get; internal set; }
public double Y { get; internal set; }
public double Z { get; internal set; }
public double G { get; internal set; }
public static Task<IList<Values.SensorInitData>> CreateAllAsync(Readings readings, FrameworkElement el)
{
return SensorCreateAll<Accelerometer>.CreateAllAsync(SensorDeviceUuid, readings, el);
}
public Task<int> InitializeAsync(GattDeviceService device, Readings readings, FrameworkElement el, byte ValueToSend)
{
return BTAccSensor.InitializeAsync(device, readings, el, ValueToSend);
}
private string _xval;
public string xValue
{
get { return _xval; }
set
{
if (value != _xval)
{
_xval = value;
OnPropertyChanged("xValue");
}
}
}
public void sensor_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
sbyte value;
switch (e.PropertyName)
{
case "B0Raw":
value = (sbyte)BTAccSensor.B0Raw;
if (value != XRaw)
{
XRaw = value;
X = value / 16.0;
X = Math.Round(X, 2);
xValue = X.ToString();
}
break;
case "B1Raw":
value = (sbyte)BTAccSensor.B1Raw;
if (value != YRaw)
{
YRaw = value;
Y = ((double)(sbyte)value) / 16.0;
Y = Math.Round(Y, 2);
G = Math.Sqrt((X * X) + (Y * Y) + (Z * Z));
G = Math.Round(G, 2);
}
break;
case "B2Raw":
value = (sbyte)BTAccSensor.B2Raw;
if (value != ZRaw)
{
ZRaw = value;
Z = ((double)(sbyte)value) / 16.0;
Z = Math.Round(Z, 2);
}
break;
}
}
// Metoden for propertychanged eventhandler
protected virtual void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
公共类加速计:值,INotifyPropertyChanged,Overvaagning.Model.Values.ISensorOperations
{
公共传感器传感器BTAccSensor{get;内部设置;}
//属性已更改事件句柄初始化器
公共事件属性更改事件处理程序属性更改;
//她在fåadgang直到tjenesten i kittet的初始jeg Universalt Entydigt标识(UUID)
静态Guid SensorDeviceUuid=Guid.Parse(“F000AA10-0451-4000-B000-000000000000”);
公共服务(
{
//定义传感器直到加速度传感器。
BTAccSensor=新的传感器加速计();
//传感器服务UUID定义直到加速计UUID。
BTAccSensor.SensorDeviceUuid=传感器设备UUID;
//Denne UUID er en karakteristisk UUID i加速计在aktivere加速计处安装
BTAccSensor.DataUuid=Guid.Parse(“F000AA11-0451-4000-B000-000000000000”);
//Denne UUID bruges直到Konfigure加速器
BTAccSensor.ConfigurationUuid=Guid.Parse(“F000AA12-0451-4000-B000-000000000000”);
//Denne UUID bruges直到修改加速计følsomheden,alt afhængig af,hvor管理通知员
//加速计skal sende pr.sekund
BTAccSensor.SpeedUuid=Guid.Parse(“F000AA13-0451-4000-B000-000000000000”);
//在斯卡尔卡尔德斯的测量方法、加速度计的模态数据之前,改变了属性定义
BTAccSensor.PropertyChanged+=传感器_PropertyChanged;
}
公共sbyte XRaw{get;内部集合;}
公共sbyte YRaw{get;内部集合;}
公共sbyte ZRaw{get;内部集合;}
公共字节值ToSend;
公共双X{get;内部集;}
公共双Y{get;内部集;}
公共双Z{get;内部集;}
公共双G{get;内部集;}
公共静态任务CreateAllalsync(阅读,框架元素el)
{
返回SensorCreateAll.CreateAllAsync(SensorDeviceUuid、读数、el);
}
公共任务初始化同步(GattDeviceService设备、读数、框架元素el、字节值ToSend)
{
返回BTAccSensor.InitializeAsync(设备、读数、el、值发送);
}
私有字符串xval;
公共字符串xValue
{
获取{return}
设置
{
如果(值!=\u xval)
{
_xval=值;
OnPropertyChanged(“xValue”);
}
}
}
public void sensor_PropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
sbyte值;
开关(如PropertyName)
{
案例“B0Raw”:
值=(sbyte)BTAccSensor.B0Raw;
if(值!=XRaw)
{
XRaw=值;
X=值/16.0;
X=数学四舍五入(X,2);
xValue=X.ToString();
}
打破
案例“B1Raw”:
值=(sbyte)BTAccSensor.B1Raw;
如果(值!=YRaw)
{
YRaw=值;
Y=(双字节)值)/16.0;
Y=数学圆(Y,2);
G=数学Sqrt((X*X)+(Y*Y)+(Z*Z));
G=数学四舍五入(G,2);
}
打破
案例“B2Raw”:
值=(sbyte)BTAccSensor.B2Raw;
如果(值!=ZRaw)
{
ZRaw=值;
Z=(双字节)值)/16.0;
Z=数学圆(Z,2);
}
打破
}
}
//propertychanged eventhandler的Metoden
受保护的虚拟void OnPropertyChanged(字符串propName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新PropertyChangedEventArgs(propName));
}
}
实际上,我正在将标签内容绑定到字符串xValue方法被触发,我实际上想将xValue定义为从传感器接收到的
双X
。问题是属性changedeventhandler
始终等于null
。为什么会出现此问题?因为我确信视图和VievModel之间的绑定确实有效。可能重复的请更好地解释您的问题。您说过传感器属性已更改()方法被触发,但propertyChangedEventHandler始终等于null…这不可能是真的…只有当propertyChangedEventHandler事件
不是null
时才能调用sensor\u PropertyChanged
方法。请按照MSDN页面上的示例获取此界面的帮助。在您的开关中您只在一种情况下设置了xValue。请尝试将xValue添加到所有情况。可能是因为您没有获得原始值