gpt4 book ai didi

c# - 另一个程序集中的 MVVM 行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:52 25 4
gpt4 key购买 nike

我在 WPF 中为我的 MVVM 项目创建了一个程序集。在我的程序集中,当我想对数据网格中的列进行排序时,我有一个激活行为。

行为排序列

 public class SortColumn : Behavior<DataGrid>
{
public string Property = "";
public bool MeaningSort = true;


public static DependencyProperty AtSortingColumnCommandProperty = DependencyProperty.RegisterAttached(
"AtSortingColumnCommand", typeof(ICommand),
typeof(SortColumn));
public static ICommand GetAtSortingColumnCommand(DependencyObject obj)
{
return (ICommand)obj.GetValue(AtSortingColumnCommandProperty);
}

public static void SetAtSortingColumnCommand(DependencyObject obj, ICommand value)
{
obj.SetValue(AtSortingColumnCommandProperty, value);
}
protected override void OnAttached()
{
AssociatedObject.Sorting += AssociatedObject_Sorting;
base.OnAttached();
}

protected override void OnDetaching()
{
AssociatedObject.Sorting -= AssociatedObject_Sorting;
base.OnDetaching();
}

//Selon MeaningSort, on renvoie une chaine OrderBy en ASC ou DESC
//Ex: MonChamp ASC
private void AssociatedObject_Sorting(object sender, DataGridSortingEventArgs e)
{
FrameworkElement element = (FrameworkElement)sender;
string FiledName = e.Column.SortMemberPath;

if (Property == null || (Property != FiledName && MeaningSort != false))
{
e.Column.SortDirection = ListSortDirection.Ascending;
MeaningSort = false;

var atEnd = GetAtSortingColumnCommand(element);
if (atEnd != null)
{
atEnd.Execute(FiledName + " ASC");
}
}
else
{
e.Column.SortDirection = ListSortDirection.Descending;
MeaningSort = true;

var atEnd = GetAtSortingColumnCommand(element);
if (atEnd != null)
{
atEnd.Execute(FiledName + " DESC");
}
}


}
}

在我的 XAML 中

 <D:DataGridTemplate  x:Name="Datagrid" 
TablePaged:ScrollViewerMonitor.AtEndCommand="{Binding LoadCommand}"
TablePaged:SortColumn.AtSortingColumnCommand="{Binding SortingColumnCommand}"
Grid.Column="0" Grid.Row="1" Grid.RowSpan="2" ItemsSource="{Binding DataProduits,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">

所以只有当我的文件在同一个程序集中时它才能正常工作。也许我不在同一个实例上?

最佳答案

附加行为非常直观,应按以下方式完成:

1) 在文档头部包含以下xmlns

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

2)定义行为所在的xmlns(也在文档头部)

xmlns:b="clr-namespace:MyAssembly.MyBehaviors;assembly=MyAssembly"

3) 按照以下方式将行为附加到元素:

 <Element>
<i:Interaction.Behaviors>
<b:MyBehavior MyDependencyProperty={Binding Foo}>
</i:Interaction.Behaviors>
</Element>

只要您遵循这些步骤,该行为就会变得依附,但请注意:

为了附加行为,附加行为的元素必须是行为的泛型参数指定类型的子类(如果您使用的是泛型 Behavior 基类) .

或者,如果您使用非通用 Behavior 基类,它必须是 DependencyObject 的子类。

编辑 1:

您实现的行为是针对 DataGrid 的,但是您的 XAML 将其附加到 DataGridTemplate 类,所有这一切都是在附加属性注册到您的行为而不是某些 TargetType 时发生的。它看起来真的无处不在......

编辑 2:

看来您采用了附加行为方法,这使得子类化行为毫无意义..

如果您已经花时间对 Behavior 进行子类化,您不妨将这些属性设为常规依赖属性。

关于c# - 另一个程序集中的 MVVM 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37948871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com