返回首页

介绍
在WPF中,有次当它是可取的绑定到静态值,而不是增加的DataContext的ViewModel。通常,要绑定到静态值的设置文件中的值。有没有绑定到这些价值观的问题;问题当值的变化,项目设置不支持INotifyPropertyChanged接口和一个PropertyChanged事件响应支持。因此,如果有属性的变化,这些变化都不会传播的意见。背景
在过去我已经添加了这些静态变量的ViewModel,这样我就可以绑定到属性,但这些确实不应该在ViewModel的一部分因为他们什么都没有做底层模型。在特定情况下,我调查的想法,我一直在寻找到如何更好地落实为代码的设计,我有一个很难维持。我有一组值,我是在存储的设置文件保存的目录路径如何恢复目录路径相关的一些枚举,或选择默认的目录。它混淆的是所有的后备选项坏的价值观,不同的目录路径。为了提高可维护性,我真的没有删除此信息的ViewModel,但因为我已经实施的变化,我决定调查从ViewModel的信息。我也想在同一类的绑定属性绑定命令。 实施
我为本文创建的例子是非常简单的。它由一个包含路径的文本框和一个按钮,让用户浏览到一个新的文件夹,这就会出现在TextBox中。
{S0的}
的第一件事是显而易见的是,我需要一个适配器类,接口的设置视图。第一个问题是,我需要绑定到一个静态类,否则,我需要有相关的窗口,而未能完成目标的DataContext类。静态类的问题是,它无法实现INotifyPropertyChanged。解决的办法是有一个静态的属性,它返回的实例实现了INotifyPropertyChanged的类,这是一个单身。我用的是同一个类的静态和实例代码。下面是创建和使用一个静态属性返回一个实例的代码:

public class DirectoryManager : INotifyPropertyChanged

{

    private static DirectoryManager _instance = new DirectoryManager();



    public static DirectoryManager Instance { get { return _instance; } }



    private DirectoryManager() { }



    public event PropertyChangedEventHandler PropertyChanged;

}

请注意,我也让私人以确保这将是一个单独的类的默认实例的构造,当然类继承从INotifyPropertyChanged并且已定义所需的PropertyChanged事件。
公共财产,以显示目录路径是一种正常的财产,用于额外的代码绑定来获取和设置文件保存的字符串:{C}
这是非常简单(我通常不直接处理PropertyChanged事件中的财产,但例子,我喜欢)。最困难的部分是布线了"浏览"按钮的支持。
不幸的是,这是不可能的按钮使用ICommand接口,看来,微软并没有提供源绑定支持(提供绑定静态变量与命令绑定)的能力。因此,我要使用RoutedUICommand代替。这绝对是超过正常命令约束力的复杂,我不喜欢(我本来已经看到了比ICommand的事件结合简单的实现),但它的工作原理,它是不坏的,有一个简单的 例子来演示如何执行1 RoutedUICommand"。内DirectoryManager类,必须包含以下创建的RoutedUICommand:
public static RoutedUICommand BrowseCommand



{

    get { return _browseCommand; }

}



public static void BrowseCommand_Executed(object sender, 

                   ExecutedRoutedEventArgs e)

{

    var path = DirectoryManager.Browse(_instance.DirectoryPath, 

                                       "Select Directory");

    if (path != null)

      _instance.DirectoryPath = path;

}



public static void BrowseCommand_CanExecute(object sender, 

       CanExecuteRoutedEventArgs e)

{

    e.CanExecute = true;

}



static DirectoryManager()

{

    _browseCommand = new RoutedUICommand("Browse for Directory",

      "BrowseCommand", typeof(DirectoryManager));

}

可以看出,我们需要一个属性返回BrowseCommand,在类的构造函数,我们需要实例的命令。
此外,我们需要定义两种方法来执行命令的执行和CanExecute方法。这些方法的名称并不重要,因为还有另一块代码,联营公司与命令的方法:{体C3}
也应该是一种方法来创建结合使用XAML,但似乎没有工作,所以我们必须在代码中做结合。
为了能够在窗口中使用命令,我们需要调用此方法,在窗口的代码隐藏:{的C4}
现在,它是可能的创建XAML提供绑定设置文件,并命令"浏览"按钮具有约束力。{C5的}
可以看出,结合TextBox的文本是:{5233}
约束力的命令按钮仅仅是:{C7-} 结论
这个实现使用绑定到设置文件,但设计实际上是更加灵活。设计可用于数据未保存的设置文件,或者甚至只依赖会议。它也有可能改变静态实例,是应用程序的不同类别状态而定。这是可以做到不打乱,不与模型关联信息的DataContext的ViewModel。

回答

评论会员: 时间:2