我遇到了一个情况,我可以用它来轻松实现相同的功能MultiDataTrigger,或者交替,使用DataTrigger了MultiBinding.是否有任何实质性理由偏好一种方法而不是另一种方法?
使用MultiDataTrigger:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=SomePath}" Value="SomeValue"/>
<Condition Binding="{Binding Path=SomeOtherPath, Converter={StaticResource SomeConverter}}" Value="SomeOtherValue"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
Run Code Online (Sandbox Code Playgroud)
使用MultiBinding:
<DataTrigger Value="foo">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource fooConv}"/>
<Binding Path=SomePath/>
<Binding Path=SomeOtherPath/>
</MultiBinding>
</DataTrigger.Binding>
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
</DataTrigger.EnterActions>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud) 我已将itemsource绑定到Datatable for Datagrid.它显示了如何删除它的额外列
我的代码:
<DataGrid Name="dataGrid" IsReadOnly="True" VerticalAlignment="Top"
ItemsSource="{Binding Cus}" AutoGenerateColumns="True"/>
Run Code Online (Sandbox Code Playgroud)
它显示额外的列如何删除它?
截屏:

在我的Windows Phone 8应用程序中,我有项目列表.我为列表项定义了ItemTemplate.
我想在每个项目中显示一个来自视图模型的值,而不是列表项本身.我应该如何设置从列表项到viewmodel的绑定.
我的数据模板是这样的:
<DataTemplate x:Key="template">
<StackPanel>
<TextBlock Text="{Binding Name}"/> <!-- From list item -->
<TextBlock Text="{Binding MyViewModel.Country ?? }"/> <!-- From view model -->
</StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
那么如何将Country属性绑定到视图模型,而不是列表项(在项目源中).
我有一个带有一些图像的ResourceDictionary:
<BitmapImage UriSource="..\Images\Bright\folder-bright.png"
x:Key="FolderItemImage" />
Run Code Online (Sandbox Code Playgroud)
我创建了一个HierarchicalTemplatefor treeview项,如下所示:
<HierarchicalDataTemplate ItemsSource="{Binding VisibleChildren}"
DataType="{x:Type st:StructureTreeItem}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ImageResourceKey}" />
<Image x:Name="iIcon2" Source="{DynamicResource FolderItemImage}"/>
<Image x:Name="iIcon"
Source="{DynamicResource {Binding ImageResourceKey}}"/>
</StackPanel>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)
现在,当显示项目时:
FolderItemImage整个想法是将项目图像设置为存储在资源中的图像,但不幸的是,上面介绍的技术不起作用,现在我知道,为什么:
<Image x:Name="iIcon3" Width="16" Height="16" Margin="0, 1, 3, 1" >
<Image.Source>
<DynamicResource ResourceKey="{Binding ImageResourceKey}" />
</Image.Source>
</Image>
Run Code Online (Sandbox Code Playgroud)
结果:
PresentationFramework.dll中发生未处理的"System.Windows.Markup.XamlParseException"类型异常
附加信息:无法在"DynamicResourceExtension"类型的"ResourceKey"属性上设置"绑定".'绑定'只能在DependencyObject的DependencyProperty上设置.
所以我必须重新解释一下我的问题:如何将模型中存储的某些数据(可能是?)转换为动态资源?它必须是一个动态资源,因为我确信它可能会在运行时发生变化.
我有两个Run标签的文本块和一个Linebreak:
<TextBlock>
<Run Text="TopText"/>
<LineBreak/>
<Run x:Name="bottomRun" Text="Bottom text"/>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
我想Run在代码中隐藏第二个标签.但是没有Visible财产......为什么会这样?如何只隐藏一个Run标签的最佳解决方案是什么?
考虑以下代码:
static void Main(string[] args)
{
var ints=new List<int> {10,11,22};
Something(ints);//Output:Count is:3
Something(new int[10]); //'System.Array' does not contain
// a definition for 'Count'
Console.ReadLine();
}
static void Something(ICollection collection)
{
dynamic dynamic = collection;
Console.WriteLine("Count is:{0}", dynamic.Count);
}
Run Code Online (Sandbox Code Playgroud)
通过List时,一切都还可以.但是当传递数组并转换为动态我得到这个错误:'System.Array' does not contain a definition for 'Count'.
我知道我的解决方案是什么,但我想知道为什么编译器有这种行为?
我是WPF的新手,我正在尝试将Windows Metro Dark主题应用到我的整个应用程序中.
我在Apps.xaml中使用了以下内容,我可以正确地看到Windows Metro Light主题.
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
现在我想将主题改为黑暗.我明白我总是可以用,
ThemeManager.ChangeTheme()
但我相信应该有一种方法可以使用XAML对应用程序的所有窗口都有效.
我的问题: 如果不在源代码中使用ThemeManager,有人能指出我如何做到这一点吗?
我一直在努力掌握这个概念,即使经过多次实验,我仍然无法弄清楚WPF中的ObservableCollections和使用BindingOperations.EnableCollectionSynchronization的最佳实践.
如果我有一个带有可观察集合的viewmodel,我使用锁启用集合同步,如下所示:
m_obsverableCollection = new ObservableCollection<..>;
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection,
m_obsverableCollectionLock);
Run Code Online (Sandbox Code Playgroud)
这是否意味着对该可观察集合的每次修改和枚举都将:
使用BindingOperations.EnableCollectionSynchronization时,我是否需要显式执行任何类型的锁定?
产生这一切的问题是,即使在使用BindingOperations.EnableCollectionSynchronization并使用我传入该方法的相同锁定锁定项目后,我偶尔会得到"这种类型的CollectionView不支持从不同于该线程的线程更改其SourceCollection调度员线程." 例外
我有一个WPF应用程序.我有一些标签和一些数据网格绑定到一些公共属性.其中一些属性是数值.
在datagrids中,我一直在使用下面的行来确保这些值只显示两个小数位,这是有效的.但是,当我使用下面相同的行作为我的标签时,它似乎对显示没有影响,因为数字显示为大约9位小数.我不明白为什么它适用于datagrid但不适用于标签?
StringFormat={}{0:0.##}
<Label Grid.Row="3" Grid.Column="1"
Content="{Binding Obs.Tstat, StringFormat={}{0:0.#}}"
HorizontalAlignment="Center" Foreground="{StaticResource brushLinFont}"
FontSize="13" FontWeight="Bold"/>
Run Code Online (Sandbox Code Playgroud)
更新的代码
<Label Grid.Row="3" Grid.Column="1"
Content="{Binding Obs.Tstat}" ContentStringFormat="{}{0:0.#}}"
HorizontalAlignment="Center" Foreground="{StaticResource brushLinFont}"
FontSize="13" FontWeight="Bold"/>
Run Code Online (Sandbox Code Playgroud) 我有一个按位枚举,FlagsAttribute像这样设置 -
[FlagsAttribute]
public enum MyEnum
{
None = 0,
First = 1,
Second = 2,
Third = 4,
Five = 8,
Six = 16,
Seven = 32,
Eight = 64,
Nine = 128
}
Run Code Online (Sandbox Code Playgroud)
现在,在C#中,我将此值存储在属性中,例如MyProperty,在保存时,我在整数列的SQL数据库中写入此属性.假设我First,Second,Five从代码中选择然后在数据库中将其保存为'11'.
我知道我可以从DB中获取值,只需要将值转换为MyEnum,它就会给我值.但是,我希望在一些存储过程中对SQL数据进行一些操作,显然我不能将它转换为Enum值.那么,有没有出路可以让我了解个人价值观.
就像在示例中如果存储了11,我可以将其作为任何方式 "1+2+8"
wpf ×9
c# ×6
.net ×2
binding ×2
datagrid ×1
datatrigger ×1
multibinding ×1
multitrigger ×1
mvvm ×1
sql ×1
sql-server ×1
t-sql ×1
xaml ×1