У меня есть эта панель док-станции, для которой я пытаюсь настроить привязки.
Проблема в том, что мой DataContext для моего XAML установлен на класс MainWindow, но мой класс, к которому я хочу привязать (autoCam), отделен от этого класса. У меня есть экземпляр autoCam, используемый в классе MainWindow, который называется «myCam», но я запутался, как заставить работать эти привязки.
Это код, который я использую на панели док-станции:
<DockPanel x:Name="BottomDock" Visibility="Collapsed" Grid.Column="2" Grid.Row="2" Grid.ColumnSpan="2" DockPanel.Dock="Bottom" Margin="0">
<Button x:Name="Rewind" Click="Rewind_Click" HorizontalAlignment="Left" Width="23" RenderTransformOrigin="0.5,0.5" Grid.Row="1"/>
<Button x:Name="Play" Content=">" Click="Play_Click" HorizontalAlignment="Left" Width="17" RenderTransformOrigin="0.5,0.5" Grid.Row="1"/>
<Button x:Name="Pause" Content="||" Click ="Pause_Click" HorizontalAlignment="Left" VerticalAlignment="Top" Width="16" Height="22" RenderTransformOrigin="0.5,0.5" Grid.Row="1"/>
<Button x:Name="FastForward" Content=">>" Click="FastForward_Click" HorizontalAlignment="Left" Width="23" RenderTransformOrigin="0.5,0.5" Grid.Row="1"/>
<TextBlock Background="Black" TextAlignment="Center" Foreground="AliceBlue" HorizontalAlignment="Left" Width="95" Text="Camera Position"/>
<TextBox Background="Black" TextAlignment="Center" Foreground="AliceBlue" HorizontalAlignment="Left" Width="40" Name="cpx" Text="{Binding Path=myCam.cameraPositionX, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Background="Black" TextAlignment="Center" Foreground="AliceBlue" HorizontalAlignment="Left" Width="40" Name="cpy" Text="{Binding Path=myCam.cameraPositionY, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Background="Black" TextAlignment="Center" Foreground="AliceBlue" HorizontalAlignment="Left" Width="40" Name="cpz" Text="{Binding Path=myCam.cameraPositionZ, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Background="Black" TextAlignment="Center" Foreground="AliceBlue" HorizontalAlignment="Left" Width="95" Text="Look Direction"/>
<TextBox Background="Black" TextAlignment="Center" Foreground="AliceBlue" HorizontalAlignment="Left" Width="40" Name="ldx" Text="{Binding Path=myCam.lookDirectionX, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Background="Black" TextAlignment="Center" Foreground="AliceBlue" HorizontalAlignment="Left" Width="40" Name="ldy" Text="{Binding Path=myCam.lookDirectionY, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Background="Black" TextAlignment="Center" Foreground="AliceBlue" HorizontalAlignment="Left" Width="40" Name="ldz" Text="{Binding Path=myCam.lookDirectionZ, UpdateSourceTrigger=PropertyChanged}"/>
</DockPanel>
Сначала я подумал, что мог бы просто написать DataContext = autoCam как свойство самой панели док-станции или для каждого отдельного текстового поля, а затем просто сказать {binding cameraPositionX} или что-то в этом роде, но это ничего не сделало.
Тогда я подумал, что мог бы просто сказать {Binding myCam.cameraPositionX}, поскольку myCam является членом класса MainWindow. Но это тоже не сработало.
В тщетной попытке я попытался объединить обе мои догадки и добавить DataContext = autoCam к свойствам всех текстовых полей, но я никогда не думал, что это действительно сработает.
Я также пытался написать следующее после datacontext = this; строка в конструкторе главного окна. Я попытался сделать это на тот случай, если проблема заключалась в том, что xaml правильно установил текстовый текст, как я хотел, но затем текстовый текст для всего пользовательского интерфейса был бы повторно применен к главному окну при запуске конструктора.
public MainWindow()
{
InitializeComponent();
Interval = new TimeSpan(0, 0, 0, 0, 10);
Rewind.Content = "<<";
runType = 2;
timerRate(runType);
Loaded += new RoutedEventHandler(MainWindow_Loaded);
DataContext = this;
cpx.DataContext = myCam;
cpy.DataContext = myCam;
cpx.DataContext = myCam;
ldx.DataContext = myCam;
ldy.DataContext = myCam;
ldz.DataContext = myCam;
//view1.IsHeadLightEnabled = true;
}
Я подумал, что, возможно, я мог бы поместить это в Window.Resources XAML:
<Window.Resources>
<ObjectDataProvider x:Key="Camera" ObjectType="{x:Type local:autoCam}" MethodName="getCamDetails"/>
</Window.Resources>
но я написал свой метод getCamDetails в своем классе autoCam следующим образом, и он дает мне исключение нулевой ссылки каждый раз, когда я пытаюсь установить CamDetails [0] в cameraPositionX.
public class autoCam : INotifyPropertyChanged
{
MainWindow mW;
public static double[] CamDetails;
public static double[] getCamDetails()
{
return CamDetails;
}
public Point3D cameraPosition
{
get { return mC.Position; }
set
{
mC.Position = value;
cameraPositionX = Convert.ToDouble(cameraPosition.X);
cameraPositionY = Convert.ToDouble(cameraPosition.Y);
cameraPositionZ = Convert.ToDouble(cameraPosition.Z);
lookDirection = mC.LookDirection;
lookDirectionX = Convert.ToDouble(lookDirection.X);
lookDirectionY = Convert.ToDouble(lookDirection.Y);
lookDirectionZ = Convert.ToDouble(lookDirection.Z);
onPropertyChanged("cameraPosition");
}
}
public double cameraPositionX
{
get { return Convert.ToDouble(cameraPosition.X); }
set { onPropertyChanged("cameraPositionX"); CamDetails[0] = cameraPositionX; }
}
public double cameraPositionY
{
get { return Convert.ToDouble(cameraPosition.Y); }
set { onPropertyChanged("cameraPositionY"); CamDetails[1] = cameraPositionY; }
}
public double cameraPositionZ
{
get { return Convert.ToDouble(cameraPosition.Z); }
set { onPropertyChanged("cameraPositionZ"); CamDetails[2] = cameraPositionZ; }
}
public Vector3D lookDirection
{
get { return mC.LookDirection; }
set {
mC.LookDirection = value;
lookDirectionX = Convert.ToDouble(lookDirection.X);
lookDirectionY = Convert.ToDouble(lookDirection.Y);
lookDirectionZ = Convert.ToDouble(lookDirection.Z);
onPropertyChanged("lookDirection");
}
}
public double lookDirectionX
{
get { return Convert.ToDouble(lookDirection.X);}
set { onPropertyChanged("lookDirectionX"); CamDetails[3] = lookDirectionX; }
}
public double lookDirectionY
{
get { return Convert.ToDouble(lookDirection.Y); }
set { onPropertyChanged("lookDirectionY"); CamDetails[4] = lookDirectionY; }
}
public double lookDirectionZ
{
get { return Convert.ToDouble(lookDirection.Z); }
set { onPropertyChanged("lookDirectionZ"); CamDetails[5] = lookDirectionZ; }
Я бы очень признателен за решение, но отказ от того, почему они не работают для меня, по сути, поможет мне намного больше в долгосрочной перспективе.
Спасибо за ваше время и помогите всем.