- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面是我的 DataGrid,其中包含一些与进一步向下的弹出控件相关联的附加属性。 ComboBox 由枚举填充。
<DataGrid Name="GenericDataGrid"
helpers:SearchBehaviours.SearchValue="{Binding ElementName=FindTextbox, Path=Text, UpdateSourceTrigger=PropertyChanged}"
helpers:SearchBehaviours.IsFindPopupOpen="{Binding ElementName=PopupFind, Path=IsOpen, UpdateSourceTrigger=PropertyChanged}"
helpers:SearchBehaviours.SearchableItems="{Binding ElementName=ComboSearchableItems, Path=SelectedValue, UpdateSourceTrigger=PropertyChanged}" >
</DataGrid>
<Popup x:Name="PopupFind">
<TextBox x:Name="FindTextbox" />
<ComboBox x:Name="ComboSearchableItems"
ItemsSource="{Binding Source={helpers:Enumeration {x:Type helpers:SearchItems}}}"
DisplayMemberPath="Description"
SelectedValue="{x:Static helpers:SearchItems.AllItems}"
SelectedValuePath="Value" />
</Popup>
这是处理行为的类:
class SearchBehaviours
{
// Using a DependencyProperty as the backing store for IsTextMatch. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsTextMatchProperty =
DependencyProperty.RegisterAttached("IsTextMatch", typeof(bool), typeof(SearchBehaviours), new UIPropertyMetadata(false));
public static bool GetIsTextMatch(DependencyObject obj)
{
return (bool)obj.GetValue(IsTextMatchProperty);
}
public static void SetIsTextMatch(DependencyObject obj, bool value)
{
obj.SetValue(IsTextMatchProperty, value);
}
public static readonly DependencyProperty SearchValueProperty =
DependencyProperty.RegisterAttached("SearchValue", typeof(string), typeof(SearchBehaviours), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.Inherits));
public static string GetSearchValue(DependencyObject obj)
{
return (string)obj.GetValue(SearchValueProperty);
}
public static void SetSearchValue(DependencyObject obj, string value)
{
obj.SetValue(SearchValueProperty, value);
}
public static readonly DependencyProperty IsFindPopupOpenProperty =
DependencyProperty.RegisterAttached("IsFindPopupOpen", typeof(bool), typeof(SearchBehaviours),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits));
public static bool GetIsFindPopupOpen(DependencyObject obj)
{
return (bool)obj.GetValue(IsFindPopupOpenProperty);
}
public static void SetIsFindPopupOpen(DependencyObject obj, bool value)
{
obj.SetValue(IsFindPopupOpenProperty, value);
}
public static readonly DependencyProperty SearchableItemsProperty =
DependencyProperty.RegisterAttached("SearchableItems", typeof(SearchItems), typeof(SearchBehaviours), new PropertyMetadata(SearchItems.AllItems));
public static SearchItems GetSearchableItems(DependencyObject obj)
{
return (SearchItems)obj.GetValue(SearchableItemsProperty);
}
public static void SetSearchableItems(DependencyObject obj, SearchItems value)
{
obj.SetValue(SearchableItemsProperty, value);
}
}
问题出在下面的IMultiValueConverter
<Style TargetType="{x:Type DataGridCell}" x:Key="textCellStyle" >
<Setter Property="helpers:SearchBehaviours.IsTextMatch">
<Setter.Value>
<MultiBinding Converter="{StaticResource SearchValueConverter}" FallbackValue="False">
<Binding Path="Content.Text" RelativeSource="{RelativeSource Self}" />
<Binding Path="(helpers:SearchBehaviours.SearchValue)" RelativeSource="{RelativeSource Self}" />
<Binding Path="(helpers:SearchBehaviours.IsFindPopupOpen)" RelativeSource="{RelativeSource Self}"/>
<Binding Path="(helpers:SearchBehaviours.SearchableItems)" RelativeSource="{RelativeSource Self}"/>
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
</MultiBinding>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="helpers:SearchBehaviours.IsTextMatch" Value="True">
<Setter Property="Background" Value="DarkOrange" />
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
它会在弹出窗口打开和关闭时触发 IMultiValueConverter。
它在文本框文本更改时触发。
但是,如果 ComboBox 中的 SelectedValue 发生变化,它不会触发。
下面是转换器,目前非常简单,触发时输出。
public class SearchValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Console.WriteLine("Triggered");
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
[编辑]
public enum SearchItems
{
[Description("All Items")]
AllItems,
[Description("Selected Items")]
SelectedItems
}
[结束编辑]
谁能告诉我这是什么问题?
最佳答案
改变 DataGridCell Style
代码如下:
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="local:SearchBehaviours.IsTextMatch">
<Setter.Value>
<MultiBinding Converter="{StaticResource SearchValueConverter}" FallbackValue="False">
<Binding Path="Content.Text" RelativeSource="{RelativeSource Self}" />
<Binding Path="(local:SearchBehaviours.SearchValue)" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}" />
<Binding Path="(local:SearchBehaviours.IsFindPopupOpen)" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}"/>
<Binding Path="(local:SearchBehaviours.SearchableItems)" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}"/>
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
</MultiBinding>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="local:SearchBehaviours.IsTextMatch" Value="True">
<Setter Property="Background" Value="DarkOrange" />
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
您将 DataGridCell 的所有附加属性传递给未分配的 MultiBinding 转换器。为了解决此问题,您必须将 DataGrid 的附加属性传递给 MultiBindingConverter。
更新:
您也可以像这样使用 ComboBox
:
<ComboBox x:Name="ComboSearchableItems"/>
& 像这样通过代码将 ItemSource 分配给它:
ComboSearchableItems.ItemsSource = Enum.GetValues(typeof(SearchItems));
如果您只想使用 XAML
进行绑定(bind),请引用 this link
关于c# - 附加属性不触发 IMultiValueConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27874890/
下面是我的 DataGrid,其中包含一些与进一步向下的弹出控件相关联的附加属性。 ComboBox 由枚举填充。 这是处理
我想要一个 PasswordBox 和另一个 PasswordBox 来重复选择的密码和一个提交按钮。 这是我得到的: WPF:
我正在 WPF MVVM 中开发应用程序。我希望有一个 Width 属性,带有一个转换器,或者 * Auto return 。我的转换器返回了良好的值,但无济于事。在这里,我的转换器 class F
我正在开发一个发票系统,并且正在使用 DataGrid 进行项目输入。我希望用户能够输入不同单位(例如英寸、英尺、米)的数量,并将输入的数量转换为商品的库存单位。我的第一个想法是实现一个 IMulti
我正在编写一个包含两个绑定(bind)的 MultiBinding - 每个都返回一个 bool 值。使用 MultiBindings 您需要指定一个 IMultiValueConverter。在我的
如您所知,Silverlight 3 不支持 IMultiValueConverter 并且...我非常需要它。一个 Web 服务代理,它定义了我需要在我的 UI 中显示的类结构。对象定义类有一些数组
我需要将 ItemsControl 中的矩形绘制为根据绑定(bind)集合中定义的值和集合的最大值计算的宽度。所以我想我需要使用 MultiValueConverter 来传递项目的值和集合的最大值。
我正在将现有的 WPF 应用程序移植到 Windows 8 应用程序。 在 WPF 应用程序中,我们大量使用 MultiValue 转换器来允许我们创建由 UI 元素属性和 View 模型属性(河马对
我想创建一个 C# WPF 表单来收集设备的测量值,但一些用户坚持使用英尺和英寸进行测量,而其他(较年轻的)用户则使用公制进行所有操作。数据库以米为单位存储所有内容,我认为这是使用 IMultiVal
问:为什么我使用 MultiBinding 和 IMultiValueConverter 的自定义 TextBox UserControl 的 Convert() 方法只被调用一次(在实例化期间)??
我创建了一个简单的转换器来连接我的 WPF 应用程序中四个文本框的文本。 这是转换器: public class FourString:IMultiValueConverter { publ
我有以下代码:
作为学习 WPF 的一部分,我刚刚完成了名为“在 WPF 中使用数据绑定(bind)”的 MS 实验室练习 ( http://windowsclient.net/downloads/folders/h
我有一个多重绑定(bind)的问题: 为了计算 Canvas.Top 值,myConv
我是一名优秀的程序员,十分优秀!