WPF を数か月実践した後、Caliburn Micro を試してみることにしました。仕事に行けないことがいくつかあります。最初にコードを投稿します。以下の質問/問題を参照してください。
public class MainViewModel : PropertyChangedBase
{
BindableCollection<PlayerProfile> _playerProfiles = staticInfos.Load();
public BindableCollection<PlayerProfile> PlayerProfiles {
get { return _playerProfiles; }
set {
_playerProfiles = value;
NotifyOfPropertyChange(() => PlayerList);
}
}
string _tb_AddPlayer;
public string TB_AddPlayer {
get { return _tb_AddPlayer; }
set {
_tb_AddPlayer = value;
NotifyOfPropertyChange(() => TB_AddPlayer);
NotifyOfPropertyChange(() => CanAddPlayer);
}
}
List<string> _pl = new List<string>();
public List<string> PlayerList {
get{
foreach (PlayerProfile p in PlayerProfiles) {
if (!_pl.Contains(p.Name)) _pl.Add(p.Name);
}
return _pl;
}
set {
_pl = value;
NotifyOfPropertyChange(()=>PlayerList);
}
}
// Dummy Test String
string _test;
public string Test {
get { return _test; }
set {
_test = value;
NotifyOfPropertyChange(() => Test);
}
}
// Button Action
public void AddPlayer() {
_playerProfiles.Add(new PlayerProfile(TB_AddPlayer));
Test = "Pressed";
NotifyOfPropertyChange(() => PlayerProfiles);
}
public bool CanAddPlayer {
get { return true; }
// doesnt work: get { return !string.IsNullOrWhiteSpace(TB_AddPlayer); }
}
}
ここでは、バインド規則を使用します。つまり、MainView のプロパティは、ビューの同じ名前の要素にバインドする必要があります。
まず最初に、これは私が作成
PlayerList
した の Player の名前の単なるリストであることに注意してください。 - でメソッドをオーバーライドしましたが。なんで?これは不器用に思えます... (このメソッドは、疑問に思っているなら、いくつかのダミーの名前を に取り込みます...)PlayerProfiles
Combobox
Combobox PlayerProfiles
PlayerList
ToString
PlayerProfile class
staticInfos.Load()
PlayerProfiles
テキストボックス ( と呼ばれる)に何かを入力し
TB_AddPlayer
てボタン ( と呼ばれる) を押すとAddPlayer
、テスト文字列が表示されるので、アクションが行われたことはわかりますが、新しい名前はコンボボックスに表示されません。また、プロパティでコメント行を使用すると、
CanAddPlayer
入力を開始したり、テキストボックスがテキストでフォーカスを失ったりしても、ボタンは有効になりません。なんで?
これらの基本的な質問で申し訳ありませんが、「Hello World」のカリバーンの例を何時間も見つめましたが、何が欠けているのかわかりません... Thx. あらかじめ!
編集:ここに.xamlがあります
<UserControl x:Class="MixGameM8_MVVM.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MixGameM8_MVVM.Views">
<UserControl.Resources>
<Style TargetType="TextBlock" x:Key="TB_A">
<Setter Property="Margin" Value="5,5,5,5" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="FontSize" Value="15" />
</Style>
<!-- ... Some more of this kind -->
</UserControl.Resources>
<Grid>
<!-- ... Grid definitions -->
<Border Style="{StaticResource Border_A}" Grid.Row="0" Grid.Column="0">
<StackPanel Name="SP_Controls">
<TextBlock Style="{StaticResource TB_A}" Text="Controls"/>
<ComboBox Style="{StaticResource CB_A}" Name="PlayerProfiles"/>
<StackPanel Orientation="Horizontal">
<TextBox Style="{StaticResource TBox_A}" Name="TB_AddPlayer" MinWidth ="100" />
<Button Style="{StaticResource Button_AddPlayer}" Content="Add Player" Name="AddPlayer" />
</StackPanel>
</StackPanel>
</Border>
<!-- ... And some more cells in the grid, one containing the dummy textbox -->
</Grid>
</UserControl>