小编Dar*_*ens的帖子

使用MVVM从WPF中的TextBox进行正确的DataGrid搜索

我是MVVM模式的新手,对于何时使用Code Behind有点困惑.我现在有一个非常简单的表单,包括一个TextBox和一个DataGrid.我想要的是能够让DataGrid根据TextBox更改其选定的项目.

我在Code Behind中完成了这项工作,使用以下代码可以正常工作:

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    for (int i = 0; i < dataGrid1.Items.Count; i++)
    {
        string cellContent = dtReferral.Rows[i][0].ToString();
        try
        {
            if (cellContent != null && cellContent.Substring(0, textBox1.Text.Length).Equals(textBox1.Text))
            {
                object item = dataGrid1.Items[i];
                dataGrid1.SelectedItem = item;
                dataGrid1.ScrollIntoView(item);
                //row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                break;
            }
        }
        catch { }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我只想突出显示Datagrid中以文本框中的文本开头的项目,并允许用户按下按钮来编辑所选项目.

在Code Behind文件中有这个逻辑是否可以?或者我需要通过某种绑定来做到这一点?如果我应该通过带有绑定的视图模型执行此操作,任何方向都将受到赞赏.谢谢.

c# wpf search datagrid mvvm

18
推荐指数
1
解决办法
3万
查看次数

启动数据时将数据传递给新ViewModel的最佳方法

我正在使用MVVM-Light Framework开发WPF数据库应用程序。我正在使用SimpleIOC注入我的数据服务,并且我的ViewModels已从XAML文件连接到视图。但是,在打开新的视图模型时,我通常还需要将另一个对象传递给视图模型(可以说我传递的是CarId的整数,以便可以从数据库中获取实际的Car)。

现在,在InitializeComponent()之后,我通过在View上使用Messenger来传递它。然后,这被视图模型捕获。这目前确实有效,但是有一些挫折。

首先,直到调用视图模型的构造函数之后,才会发送消息。可以说我在ViewModel中有一个ThisCar对象属性,而我有一些辅助属性,例如一个名为Brand的字符串,它返回ThisCar.Brand。

    public const string ThisPersonPropertyName = "ThisCar";
    private Model.Car _thisCar;
    public Model.Car ThisCar
    {
        get
        {
            return _thisCar;
        }

        set
        {
            if (_thisCar== value)
            {
                return;
            }

            RaisePropertyChanging(ThisCarPropertyName);
            _thisCar= value;
            RaisePropertyChanged(ThisCarPropertyName);
        }
    }

    public const string BrandPropertyName = "Brand";
    public string Brand
    {
        get
        {
            return ThisCar.Brand;
        }

        set
        {
            if (ThisCar.Brand == value)
            {
                return;
            }

            RaisePropertyChanging(BrandPropertyName);
            ThisCar.Brand = value;
            RaisePropertyChanged(BrandPropertyName);
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,当构造函数被调用时,我必须像这样在视图模型构造函数中初始化ThisCar,否则在创建ViewModel时,在ThisCar.Brand上会出现null错误。

ThisCar = new CarObject();
Run Code Online (Sandbox Code Playgroud)

然后,在将其初始化为空对象之后,将调用Message,然后我将基于Car ID从数据库中提取真正的Car。

ThisCar = webService.GetCar(carId);
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,品牌属性不会得到更新,因为没有什么调用该品牌的OnPropertyChanged。

我有两种解决方法,但对我来说,它们更像是骇客。首先是手动为需要更新的任何属性调用OnPropertyChanged。其次是我删除所有小的属性,并将所有内容直接绑定到ThisCar属性(这意味着我必须在模型中实现INotifyPropertyChanged)。

请让我知道我是否只是很挑剔,或者是否有更好的方法可以做到这一点。我的工作方式可行,但只是不适合我。谢谢。

c# wpf mvvm mvvm-light

5
推荐指数
1
解决办法
9434
查看次数

具有相同ViewModel的多个实例的MVVM-Light Messenger

我在MVVM上相对较新,并遇到了一个问题.我们正在使用MVVM-Light框架在WPF中编写数据库应用程序.程序状态的规范我们必须能够立即打开ClaimView的多个实例.

要打开新窗口,我们将从ViewModel发送一条消息,该消息将在View中捕获,并打开新窗口.我们使用枚举令牌来识别正确的收件人以获取请求.

现在,如果我有两个ClaimView实例同时打开,并且我调用Messanger,它会打开两个相同的窗口,因为两个视图都在接收消息.

我们尝试在单独的线程上运行ViewModel的每个实例,并通过输出ManagedThreadId进行验证,并且两个实例仍然收到消息.

我们也注册了注册消息,因此这不是问题.

任何帮助,将不胜感激.

c# wpf mvvm mvvm-light

4
推荐指数
1
解决办法
2531
查看次数

标签 统计

c# ×3

mvvm ×3

wpf ×3

mvvm-light ×2

datagrid ×1

search ×1