说真的,似乎每次我想让我的UI元素互相交谈,我最终编写了一个新的,定制的,IValueConverter :(有人告诉我,我做错了,拜托!
例子:
UriIsValidConverter!UriIsValidAndBoolIsFalseMultiConverter!DirectoryPathToFileList转换器!FileInfoToBitmap转换器的时间!StatusStringToSolidColorBrushConverter!我真的认为这并不比使用TextChanged事件(或其他)手动连接所有内容的旧Windows Forms方法好多少.我猜这仍然是一个选择.也许这就是人们真正做的事情,而我正在努力使一切都适合数据绑定范式?
所以,是的,请告诉我这是否真的是WPF编码的方式---或者如果我做错了,如果是的话,我应该做什么.
Mar*_*ris 10
你的方法是完全有效的(尽管我会在第二个例子中使用多重绑定,而不是使用这样的专用转换器),但是通过将所有逻辑放入XAML,您在应用程序的外观和方式之间产生了非常高的耦合.它的行为,因此你可能想要调查MVVM模式来分离这些东西.
在MVVM模式下,您的XAML(视图)只包含非常简单的数据绑定到ViewModel中,ViewModel处理所有逻辑并通过INotifyPropertyChanged接口更新视图.第三个示例的代码可能类似于:
public class DirectoryManagerViewModel : INotifyPropertyChanged
{
private string _directory;
public string Directory
{
get { reutrn _directory; }
set
{
if (_directory != value)
{
_directory = value;
OnPropertyChanged("Directory");
if (IsValidDirectory(value))
{
PopulateFiles();
}
}
}
}
public ObservableCollection<FileViewModel> Files { get; private set; }
private bool IsValidDirectory(string directory)
{
//return if the directory exists etc.
}
private bool PopulateFiles()
{
//Populate Files with files in directory
}
}
Run Code Online (Sandbox Code Playgroud)
其中FileViewModel是另一个包含文件名称和图标的视图模型.
这种方法的优点是ViewModel可以与其他视图和其他技术(如ASP.NET或Winforms)一起使用,因此您不会被锁定到WPF堆栈中.(如果您在负责外观的设计人员和负责该行为的开发人员的环境中工作,这有助于定义这些边界)
虽然这个逻辑确实需要去某个地方,但是有更好和更糟的方法来构建你的应用程序,你仍然会编写带有字符串的代码并将其转换为一系列文件名和图标.
首先,您可能想要阅读有关Model-View-ViewModel模式(MVVM)的内容.Josh Smith最近在MSDN杂志上发表了一篇精彩文章.MVVM和WPF完美结合在一起.做得对,你不需要IValueConverters那么多.您现在的处理方式是在可视化和应用程序操作之间产生非常紧密的耦合.MVVM旨在解耦这些元素.
在此上下文中,您的视图模型将为您跟踪状态.如果视图模型中CanExecute某个方法的方法ICommand返回true,则将启用您的按钮.同样的概念可以处理在处理某些事物时禁用按钮.
您想要显示列表框中指定的特定目录中的文件列表吗?有一个DirectoryViewModel视图模型,它将通过绑定到视图模型来处理向视图提供文件列表.可以使用DataTemplateXAML中指定的文件来指定文件的显示,后面没有代码.这个相同的概念可以处理向视图提供图标,其视图可以在模板中指定.
如果状态消息包含"错误",您希望状态为红色,否则为绿色?让视图模型处理确定状态并让视图绑定到该状态,现在您只需IStateConverter要将状态适当地转换为红色或绿色(这是在MVVM上下文中处理此问题的众多方法之一).
养成将数据和状态与视图分开的习惯,您的应用程序将松散耦合,更易于设计和维护,并且更易于测试.
不知道你是不是错了,只是让它变得比它更难!
我使用MVVM,所以在编写客户转换器的地方,我在视图模型上提供了一个可绑定的属性,告诉视图该做什么.例如:
通过将此逻辑移动到视图模型中,我得到:
这种方法使用WPF的一个优点,即它的绑定功能.
| 归档时间: |
|
| 查看次数: |
906 次 |
| 最近记录: |