0

私はPowerShellで遊んで始めました。現時点では、WPFウィンドウを表示するC#クラスを読み込もうとしています。ウィンドウに配置されたTextBlockは、クラスのプロパティにバインドされます。(CmdLineアプリケーションでバインディングをテストしましたが、正常に機能します)…しかし、add-tapeを使用してPowerShellからクラスをロードすると、バインディングは機能しません。

私は何が間違っているのですか?

$a =@"
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

public class TestClass : INotifyPropertyChanged
    {
        private bool _showed = false;
        private String _myString;

        public String MyString
        {
            get { return _myString; }
            set
            {
                _myString = value;
                if (!_showed)
                    ThreadStuff();
                OnPropertyChanged("MyString");
            }
        }

        public TestClass()
        {
        }

        public TestClass(String value)
        {
            _myString = value;
        }

        private void ThreadStuff()
        {
            _showed = true;
            var thread = new Thread(new ThreadStart(() =>
            {
                CreateWindow();
                System.Windows.Threading.Dispatcher.Run();
            }))
            {
                IsBackground = true
            };
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }

        private void CreateWindow()
        {
            var w = new Window();
            var g = new Grid();
            g.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
            g.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
            g.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
            g.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });

            for (int i = 0; i < g.RowDefinitions.Count; i++)
            {
                for (int j = 0; j < g.ColumnDefinitions.Count; j++)
                {
                    var b = new Button { Content = new TextBlock { Text = i.ToString() } };
                    Grid.SetRow(b, i);
                    Grid.SetColumn(b, j);
                    g.Children.Add(b);
                }
            }

            var t = new TextBlock();
            var binding = new Binding { Source = MyString, Mode = BindingMode.OneWay };
            t.SetBinding(TextBlock.TextProperty, binding);

            (g.Children[g.Children.Count - 1] as Button).Content = t;

            w.Content = g;
            w.Show();
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
"@

Add-Type -TypeDefinition $a -ReferencedAssemblies presentationcore, presentationframework, windowsbase, "System.Xaml"

$test = New-Object TestClass
$test.MyString = 'hi from powershell'

ところで。私は初めてPowerShellを使用しています(これまでC#を使用したばかりです)。最終的には、Xamlファイルをビューとしてロードし、C#ファイルをビューモードとしてロードし、それらをまとめて、PowerShellからvmのプロパティを設定することが私の目標です(はい、それは完全に愚かであり、通常のファイルを作成する方がはるかに簡単ですWPFアプリケーション…しかし、私はそれをこのようにやらなければなりません…今は学校に通っています^^)

4

1 に答える 1

1

どのバージョンの powershell を使用していますか? あなたのコードは、Win8のPowershell 3.0で「機能」します。

C# コンソール アプリケーションを介して実行した場合と同じように動作するため、「動作する」と言います。

  • 設定するまで何も起こりませんMyString
  • 初めて を設定MyStringすると、GUI がポップアップし、右下の象限に の値が含まれます。MyString
  • の以降の変更では何も起こりませんMyString(バインディングが正しく設定されていないため、更新してもテキストは更新されませんMyString)

これが望ましい動作であり、まったく機能しない場合は、古いバージョンの PS に問題がある可能性があります。

あなたの本当の問題は、バインディングが機能していないことだと思います。それは、次の行のためです。

var binding = new Binding { Source = MyString, Mode = BindingMode.OneWay };

する必要があります

var binding = new Binding { Source = this, Mode = BindingMode.OneWay, Path = new PropertyPath("MyString") };

その変更を行うと、C# コンソール アプリと PowerShell の両方ですべてがうまく接続されているように見えます。

于 2013-02-20T21:28:33.400 に答える