0

Button と ListView を持つ UserControl があります。

モデル

public class Item
{
    private string _name = string.Empty;

    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }
}

ビューモデル

public class ViewModel : NotifyProperty
{
    private Command addCommand;
    public ICommand AddCommand
    {
        get
        {
            if (addCommand == null)
                addCommand = new Command(addItem);
            return addCommand;
        }
    }

    private ObservableCollection<Item> _itemCollection;

    public ViewModel()
    {

        ItemCollection = new ObservableCollection<Item>();
        Item newItem = new Item();
        newItem.Name = "Joe";
        ItemCollection.Add(newItem);
    }

    public ObservableCollection<Item> ItemCollection
    {
        get
        {
            return _itemCollection;
        }
        set
        {
            _itemCollection = value;
            OnPropertyChanged("ItemCollection");
        }
    }

    private void addItem(Object obj)
    {
        Item newItem = new Item();
        newItem.Name = "Chris";
        ItemCollection.Add(newItem);
    }
}

ユーザー コントロール (XAML)

<UserControl.DataContext>
    <local:ViewModel />
</UserControl.DataContext>

<UserControl.Resources>
    <DataTemplate x:Key="ItemTemplate">
        <StackPanel Orientation="Vertical">
            <Label Content="{Binding Name}" />
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>

<Grid>
    <DockPanel>
        <Button Width="100" Height="30" Content="Add" Command="{Binding AddCommand}" DockPanel.Dock="Top" />
        <ListView ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding ItemCollection}" />
    </DockPanel>
</Grid>

次に、これを MainWindow に次のように追加します

 public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        this.mainContentControl.Content = new ListControl();

    }
}

これは正常に機能し、[追加] ボタンをクリックすると、"Chris" という名前が ListView に追加されます。

次に、MainView にボタンを追加し、その Command プロパティを ViewModel に次のようにバインドします。

<Grid>
    <DockPanel>
        <Button Width="100" Height="30" Content="Add" Command="{Binding AddCommand}" DockPanel.Dock="Top">
            <Button.DataContext>
                <local:ViewModel />
            </Button.DataContext>
        </Button>
        <ContentControl x:Name="mainContentControl" />
    </DockPanel>       
</Grid>

MainWindow でこのボタンをクリックすると、コマンドが ViewModel に送信され、addItem イベントが呼び出され、「Chris」という名前が ItemCollection に追加されますが、ListView は更新されません。私は何を間違っていますか?

4

1 に答える 1