WPF MVVM模式

时间:2016-03-24 14:33:31

标签: wpf mvvm

我正在用mvvm模式做一个简单的项目。它有一个列表,每行有一个文本框和删除按钮,在

但是我们有一个文本框并添加如下按钮:

name1 buttondelete

name2 buttondelete

name3 buttondelete

textbox buttonadd

单击按钮删除该行应删除,单击bottonadd文本框的文本应作为新列表插入

行。

我有三层Sepand.WPFProject.Model,Sepand.WPFProject.ViewModel,Sepand.WPFProject.View;

在模型中我有上下文和存储库和模型(这里我的模型是具有Name& ID属性的Category)类。存储库是这样的:

    public class CategoryViewModel    
{
    ModelRepository<Category> repository = new ModelRepository<Category>();
    ObservableCollection<Category> categories = new ObservableCollection<Category>();
    Category category = new Category();

    public ObservableCollection<Category> GetAll()
    {
        IQueryable<Category> categoryRepository = repository.GetAll();

        foreach (Category Category in categoryRepository)
            categories.Add(Category);
        return categories;
    }

    public ObservableCollection<Category> GetAllCategories
    {
        get { return GetAll(); }
    }
     public string TxtName
    {
        get { return category.Name; }
        set { category.Name = value; }
    }
在viewModel中我有classViewModel类,如下所示:

this.DataContext = new CategoryViewModel();

在我背后的代码中查看

    <Window.Resources>
    <DataTemplate x:Key="CategoryTemplate">
        <Border Width="400" Margin="5" BorderThickness="1" BorderBrush="SteelBlue" CornerRadius="4">

            <StackPanel Grid.Row="0" Orientation="Horizontal">
                <TextBlock Width="300" Margin="5" Text="{Binding Path=Name}"></TextBlock>
                <Button Name="btnDeleteCategory" Width="50" Margin="5" Click="btnDeleteCategory_Click" >-</Button>
            </StackPanel>

        </Border>
    </DataTemplate>
</Window.Resources>

在XAML中我有

            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>

                <ListBox Grid.Column="0"  Grid.Row="0" Name="lstCategory" ItemTemplate="{StaticResource CategoryTemplate}" ItemsSource="{Binding Path=GetAllCategories}"/>
                <StackPanel Margin="5" Grid.Column="0" Grid.Row="1" Orientation="Horizontal">
                    <Label Content="Name : "/>
                    <TextBox Name="TxtName" Text="{Binding Path=TxtName ,Mode=TwoWay}" Width="260"/>
                    <Label Width="50"/>
                    <Button Width="50" Content="+" Name="btnAddCategory" Click="AddCategory_Click" />
                </StackPanel>

</Grid>

</Grid>

                <TextBlock Width="300" Margin="5" Text="{Binding Path=Name}"></TextBlock>

现在当我运行app时,列表框中填充了数据库中的数据;但我无法编写addbutton和

的代码

删除按钮;

谁能告诉我该怎么办?

为什么我无法将列表中的文本框文本绑定到CategoryViewModel类的TxtName属性?

我的意思是

public static string GetDictionaryValue(string key, CultureInfo culture, UmbracoContext context)
{
    var dictionaryItem = context.Application.Services.LocalizationService.GetDictionaryItemByKey(key);
    if (dictionaryItem != null)
    {
        var translation = dictionaryItem.Translations.SingleOrDefault(x => x.Language.CultureInfo.Equals(culture));
        if (translation != null)
            return translation.Value;
    }
    return key; // if not found, return key
}

当我写Binding Path = TxtName时,列表框不显示数据但是绑定路径=名称

它显示来自数据库的数据

1 个答案:

答案 0 :(得分:2)

你的问题有点分散。但我会尝试解决我认为你的问题。

你在后面的代码中说:

this.DataContext = new CategoryViewModel();

但没有别的。

检查按钮无效的原因首先要看的是它正在执行的操作。您的XAML声明它正在使用点击事件:

btnDeleteCategory_Click
那是哪里的?它也不在你的代码隐藏中吗?可能是你没有得到任何东西,这就是为什么你的按钮没有做任何事情 - 你没有指示它做任何事情!

在MVVM中,您应该使用ViewModel中的命令绑定按钮,类似于将数据绑定到ViewModel中的属性的方式。

您需要以下内容:

Command="{Binding Path=DeleteCommand}"

在您看来,并且:

public ICommand DeleteCommand
{
    get { return new DelegateCommand<object>(FuncToCall, FuncToEvaluate); }
}

private void FuncToCall(object context)
{
    //this is called when the button is clicked - Delete something
}

private bool FuncToEvaluate(object context)
{
    //this is called to evaluate whether FuncToCall can be called
    //for example you can return true or false based on some validation logic
    return true;
}

绑定到TxtName可能无法正常工作,因为它没有实现/调用PropertyChanged。