Как установить привязку текстового поля к классу, не относящемуся к классу контекста данных - PullRequest
0 голосов
/ 16 января 2019

У меня есть эта панель док-станции, для которой я пытаюсь настроить привязки.

Проблема в том, что мой 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; }

Я бы очень признателен за решение, но отказ от того, почему они не работают для меня, по сути, поможет мне намного больше в долгосрочной перспективе.

Спасибо за ваше время и помогите всем.

1 Ответ

0 голосов
/ 16 января 2019

Было бы также лучше совместно использовать класс MainWindow, но это звучит как помещение свойства в ваш класс MainWindow для предоставления экземпляра myCam и привязка непосредственно к этому свойству.

public partial class MainWindow : Window
{
    private AutoCam autoCam;

    public AutoCam AutoCam
    {
        get { return autoCam; }
        set { autoCam = value; }
    }


    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        this.autoCam = new AutoCam();
    }
}

public class AutoCam
{
    private string someText;

    public string SomeText
    {
        get { return someText; }
        set { someText = value; }
    }

    public AutoCam()
    {
        this.SomeText = "Some Text";
    }

}

И привязка будет такой.

<Label Content="{Binding AutoCam.SomeText}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...