私は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アプリケーション…しかし、私はそれをこのようにやらなければなりません…今は学校に通っています^^)