5

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 の名前の単なるリストであることに注意してください。 - でメソッドをオーバーライドしましたが。なんで?これは不器用に思えます... (このメソッドは、疑問に思っているなら、いくつかのダミーの名前を に取り込みます...)PlayerProfilesComboboxCombobox PlayerProfilesPlayerListToStringPlayerProfile classstaticInfos.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>
4

2 に答える 2

4

まず、プロパティを削除することから始め、次のようにプロパティPlayerListを更新します。PlayerProfiles

 public BindableCollection<PlayerProfile> PlayerProfiles {
    get { return _playerProfiles; }
    set { 
        _playerProfiles = value;
        NotifyOfPropertyChange(() => PlayerProfiles);
    }
}

次に、ビュー モデルのプロパティを、それらがどのようにレンダリングされるかを説明するものとは呼びTB_AddPlayerませAddPlayerPlayerName

次に、 ComboBox を呼び出すとPlayerProfiles、バインディングが規則に従って自動的に行われます。AddPlayer メソッドでは、バッキング フィールドではなく、プロパティを介して新しいプレーヤー プロファイルを追加します。

変化する:

public void AddPlayer() {
     _playerProfiles.Add(new PlayerProfile(TB_AddPlayer));
     Test = "Pressed";
     NotifyOfPropertyChange(() => PlayerProfiles);
}

に:

public void AddPlayer() {
     this.PlayerProfiles.Add(new PlayerProfile(this.PlayerName));
}

PlayerProfiles は BindableCollection であるため、変更通知が実行され、ComboBox が更新されます。

また、バッキングフィールドのアクセス修飾子を常に明示的に指定します。つまり、private string _playerName;文字列だけではありません。_playerName;

これらの変更を試して、まだ問題がある場合は質問のコードを更新してください。

于 2012-10-22T12:34:09.623 に答える
1

私は答えを得たと思います

テキストボックスでupdatesourcetrigger=property changedを使用します。依存関係(または依存関係が名前を覚えていない)属性を使用しなかったため、実行できませんが更新されていません。

コンボボックスが更新されないため、バインド可能なコレクションにバインドする必要があります。

于 2012-10-22T12:59:40.570 に答える