Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVVM的用户控件绑定_C#_Wpf_Mvvm_User Controls - Fatal编程技术网

C# 使用MVVM的用户控件绑定

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>

为了理解UserControls的绑定,我目前正在进行不同的练习

我有以下用户控件:

<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添加到所有情况。可能是因为您没有获得原始值