Как показать новое окно, когда кнопка, содержащая команду DataContext - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть этот контейнер для моей модели представления под названием VMContainer в моем XAML

<Window.DataContext>
    <local:VMContainer/>
</Window.DataContext>

Если я получу к нему доступ из своего контейнера, кнопка не будет работать, и ничего не произойдет.но если я получу доступ непосредственно к моей MOVIE ViewModel, это будет работать.И я не понимаю, как это может произойти.

Вот мой Контейнер

public class VMContainer
{
    public Movie Movie { get; set; } = new Movie();
    public TV TV { get; set; } = new TV();
}

Один из моих ViewModel

public class Movie
{
    public ICommand Clicked { get; private set; }
    public DataView Library { get; private set; }
    public Movie()
    {
        DataTable data = new DataTable();
        using (MySqlConnection connection = new MySqlConnection("SERVER=localhost;" + "DATABASE=library;" + "UID=root;" + "PASSWORD=;"))
        {
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            adapter.SelectCommand = new MySqlCommand("Select * from index_movie_list", connection);
            adapter.Fill(data);
        }
        Library = data.DefaultView;
        Clicked = new MovieClicked(this);
    }
}

Метод Click
Pages.MovieDetail является целью для нового окна, но хотя я изменяю Execute на простой MessageBox, он все равно ничего не делает

 partial class MovieClicked : ICommand
{
    private Movie __vModel;

    public MovieClicked(Movie vModel)
    {
        __vModel = vModel;
    }
    public event EventHandler CanExecuteChanged { add { } remove { } }
    public bool CanExecute(object parameter)
    {
        return true;
    }
    private static int a;
    private static string b;
    private static string c;
    public static DataTable d = new DataTable();
    public void Execute(object parameter)
    {
        var id_movie = (int)parameter;
        var rowIndexx = id_movie - 1;
        a = (int)(__vModel.Library[rowIndexx]["id_movie"]);
        b = (string)(__vModel.Library[rowIndexx]["target"]);
        c = (string)(__vModel.Library[rowIndexx]["title"]);
        using (MySqlConnection connection = new MySqlConnection("SERVER=localhost;" + "DATABASE=library;" + "UID=root;" + "PASSWORD=;"))
        {
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            connection.Open();
            adapter.SelectCommand = new MySqlCommand("Select * from index_movie_list where id_movie ='" + a + "'", connection);
            adapter.Fill(d);
            connection.Close();
        }
        z = a;
        x = b;
        y = c;
        Pages.MovieDetail subWindow = new Pages.MovieDetail();
        subWindow.Show();
    }
    public static int z;
    public static string x;
    public static string y;
}

и последний мой XAML
мой xaml содержит id_movie для получения идентификатора, где янажмите кнопку

<ItemsControl Background="#191919" ItemsSource="{Binding Path=Movie.Library}" BorderThickness="0">
<ItemsControl.ItemTemplate>
    <DataTemplate DataType="viewModels:Card">
        <Button Style="{StaticResource OrangeButton}" Margin="0,2,0,0" Command="{Binding Path=DataContext.Clicked, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" CommandParameter="{Binding Path=id_movie}">
            <StackPanel Margin="0,0,0,0">
                <Grid Margin="5,5,5,5">
                    <Rectangle RadiusX="0" RadiusY="0" Width="150" Height="230">
                        <Rectangle.Fill>
                            <ImageBrush  x:Name="myImage" ImageSource="{Binding Path=cover}"/>
                        </Rectangle.Fill>
                    </Rectangle>
                    <Label FontFamily="Bebas Neue" Background="#CC000000" Margin="115,10,0,193" Content="{Binding Path=year}" HorizontalContentAlignment="right" Foreground="White"/>
                    <Label FontFamily="Bebas Neue" Width="150" Background="#CC000000" Margin="0,187,0,16" Content="{Binding Path=title}" HorizontalContentAlignment="Center" Foreground="White"/>
                </Grid>
            </StackPanel>
        </Button>
    </DataTemplate>
</ItemsControl.ItemTemplate>

Примечание: Если я использую Movie напрямую без контейнера, моя кнопка работает, но я не могу использовать ее для других ViewModel.

1 Ответ

0 голосов
/ 27 ноября 2018

Ошибка в пути Binding для команды Clicked.

<Button  Margin="0,2,0,0" Command="{Binding Path=DataContext.Movie.Clicked, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" CommandParameter="{Binding Path=id_movie}"></Button>
...