DataContext и Command в silverlight при совместном использовании не работают - PullRequest
0 голосов
/ 01 декабря 2011

Я использую Silverlight 4.0 для реализации архитектуры MVVM, у меня есть пользовательский контроль TestMVVM.View.EmployeeView и представление EmployeeList в этом пользовательском контроле.EmployeeList содержит текстовое поле и кнопку.Моя проблема в том, что когда я использую DataContext в EmployeeList, как указано в коде, команда кнопки перестает работать, но если я удаляю DataContext из EmployeeList, команда кнопки работает нормально.

<UserControl x:Class="TestMVVM.View.EmployeeView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:VM="clr-namespace:TestMVVM.ViewModel"
    xmlns:view="clr-namespace:TestMVVM.View"          
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
    >
    <UserControl.DataContext>
        <VM:EmployeeListViewModel/>
    </UserControl.DataContext>
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions >
            <RowDefinition ></RowDefinition>
            <RowDefinition ></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions >
            <ColumnDefinition ></ColumnDefinition>
            <ColumnDefinition ></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <sdk:DataGrid AutoGenerateColumns="False" Height="160"  HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="105" ItemsSource="{Binding EmployeeList,Mode=OneTime}" SelectedItem="{Binding SelectedEmployee,Mode=TwoWay}" >
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn Header="Age" Binding="{Binding Age,Mode=TwoWay}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto" />
                <sdk:DataGridTextColumn Header="Name" Binding="{Binding Name,Mode=TwoWay}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto" />
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>
        <view:EmployeeList  Grid.Row="0" Grid.Column="1" DataContext="{Binding SelectedEmployee}" >

        </view:EmployeeList>


    </Grid>
</UserControl>
//view 2
<UserControl x:Class="TestMVVM.View.EmployeeList"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:VM="clr-namespace:TestMVVM.ViewModel" 
    d:DesignHeight="300" d:DesignWidth="400">
    <Grid x:Name="LayoutRoot" Background="White" >
        <Grid.RowDefinitions>
            <RowDefinition Height="20" ></RowDefinition>
            <RowDefinition Height="20" ></RowDefinition>
            <RowDefinition Height="20" ></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions >
            <ColumnDefinition ></ColumnDefinition>
            <ColumnDefinition ></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBlock x:Name="name" Text="Name" ></TextBlock>
        <TextBox Grid.Column="1" x:Name="txt_name" Text="{Binding Name,Mode=TwoWay}" >
        </TextBox>
        <TextBlock Grid.Row="1"  x:Name="age" Text="Age" ></TextBlock>
        <TextBox Grid.Column="1" Grid.Row="1" x:Name="txt_age" Text="{Binding Age,Mode=TwoWay}" >
        </TextBox>
        <Button x:Name="btn_Add" Grid.Row="3" Content="Add" Command="{Binding Path=testCommand}" ></Button>
    </Grid>
</UserControl>

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Я наткнулся на решение моей проблемы. Что мне нужно сделать, это создать две viewmodel, одну для EmployeeList и вторую для EmployeeView, а затем команда EmployeeView начнет выполняться.

0 голосов
/ 01 декабря 2011

Если вы специально установили контекст данных для своего элемента управления, этот элемент управления создаст новый экземпляр этого класса. Следовательно, ваш EmployeeList и EmployeeView будут использовать разные контексты данных.

Если вы не укажете контекст данных в пользовательском элементе управления EmployeeList, этот элемент управления наследует DataContext своего родителя (т. Е. EmployeeGrid). Как правило, вы хотите, чтобы элемент управления наследовал контекст данных его родителя, поэтому, вероятно, вам нужна именно эта конфигурация.

Из твоего вопроса не было ясно, чего ты хотел ... надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...