我有一个视图模型,其中包含一个公开事物集合的属性.我有一个ComboBox,其ItemsSource属性绑定到此集合.现在用户可以从列表中进行选择.
我想允许用户清除选择,所以我想向ComboBox添加一个项目(即Null).这很简单.
我决定尝试为ItemsSource使用CompositeCollection,以便我可以将现有列表中的项添加到ComboBox以及额外的Null项.
经过一段时间的斗争,我决定回到CompositeCollection类的文档.我复制了他们的示例并将其修改为使用视图模型而不是静态资源.
我发现当我将CollectionContainer绑定到ViewModel公开的列表时,列表中没有任何项目显示.
我不知道如何解决这个问题,我正在寻找关于这个主题的任何建议.
这是我的XAML代码:
<Window Background="CornflowerBlue" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:TryingWPF" x:Class="CompositeCollections" Title="CompositeCollections" SizeToContent="WidthAndHeight">
<Window.Resources>
<c:CompositeCollectionVM x:Key="CompositeCollectionVM"/>
<XmlDataProvider x:Key="GreekHeroesData" XPath="GreekHeroes/Hero">
<x:XData>
<GreekHeroes xmlns="">
<Hero Name="Jason" />
<Hero Name="Hercules" />
<Hero Name="Bellerophon" />
<Hero Name="Theseus" />
<Hero Name="Odysseus" />
<Hero Name="Perseus" />
</GreekHeroes>
</x:XData>
</XmlDataProvider>
<DataTemplate DataType="{x:Type c:GreekGod}">
<TextBlock Text="{Binding Path=Name}" Foreground="Gold"/>
</DataTemplate>
<DataTemplate DataType="Hero">
<TextBlock Text="{Binding XPath=@Name}" Foreground="Cyan"/>
</DataTemplate>
</Window.Resources>
<StackPanel DataContext="{StaticResource CompositeCollectionVM}">
<TextBlock FontSize="18" FontWeight="Bold" Margin="10" HorizontalAlignment="Center" Foreground="WhiteSmoke">Trying Composite Collections</TextBlock>
<DockPanel>
<ListBox Name="myListBox" Height="300" Background="#99333333">
<ListBox.ItemsSource> …Run Code Online (Sandbox Code Playgroud) 在C#中,您可以使用implicit关键字来定义隐式的用户定义类型转换运算符.
在VB.NET中,您可以定义一个CType转换运算符,它将用户定义的类型显式转换为另一种类型.
有没有办法在VB.NET中声明隐式转换运算符?
我似乎无法找到关于此的任何信息....
我在Widening运营商的MSDN文档中找到了我的答案.显然,CType Widening运算符被"调用"用于隐式转换,而CType Narrowing运算符被调用用于显式转换.
起初,我认为这个文档不正确,因为我在测试期间遇到了异常.我重新测试并发现一些非常奇怪的东西.当使用"="运算符完成隐式转换时,我实现为扩展转换运算符的函数工作正常.
例如,以下内容将隐式地将Something类型转换为MyClass.它Widening正确调用我的转换实现,一切正常,没有错误:
Dim y As Something
Dim x As MyClass = y
Run Code Online (Sandbox Code Playgroud)
但是,如果隐式转换是在foreach循环中完成的,则它不起作用.
例如,当在循环中隐式转换类型时,以下代码将抛出异常(" 无法将'Something'类型的对象强制转换为'MyClass' "):SomethingMyClassFor Each
Dim anArrayOfSomethingTypes() As Something = getArrayOfSomethings()
For Each x As MyType In anArrayOfSomethingTypes
....
Next
Run Code Online (Sandbox Code Playgroud)
我们非常感谢您对此的任何见解.
我有一个用户控件谁的根元素是一个Grid.
我还有一个ContentControl,它作为一个占位符,用于加载数据时填充的一些文本.此控件可以在用户控件中移动,因此它的位置可以在任何位置.
如果文本太长而无法放入用户控件的根网格中,我想减小ContentControl的字体大小,直到文本适合.
我的问题是我似乎无法找到我可以处理的事件来完成这个过程.我尝试使用ContentControl.LayoutUpdated事件;但是,这个的sender参数似乎总是没有...这实际上没有用!
我真的很期待有关如何实现这一目标的任何建议.
谢谢
-Frinny
我有一个ResourceDictionary,其中包含我的应用程序中使用的控件的样式定义.
所有样式都适用于窗口中的控件...但是不应用ResourceDictionary中窗口本身的样式.
这是我的ResourceDictionary中的XAML,其中包含我要应用于窗口的样式:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:primatives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type Window}">
<Setter Property="Background" Value="#FF121212"></Setter>
<Setter Property="Height" Value="768"></Setter>
<Setter Property="Width" Value="1024"></Setter>
</Style>
<!-- .... -->
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的窗口的XAML(尝试使用此样式):
<Window x:Class="TryingStyles"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TryingStyles">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/StylesDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="Label" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="Label1" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="56,14,0,0" Name="TextBox1" VerticalAlignment="Top" Width="120" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TabControl Height="206" HorizontalAlignment="Left" Margin="12,43,0,0" Name="TabControl1" VerticalAlignment="Top" Width="250">
<TabItem Header="TabItem1" Name="TabItem1">
<Grid></Grid>
</TabItem>
</TabControl>
<GroupBox Header="GroupBox1" Margin="268,43,12,12" Width="396"></GroupBox>
</StackPanel>
</StackPanel> …Run Code Online (Sandbox Code Playgroud) 在WPF网格有一个"IsMouseOver"属性,你可以在网格的风格的触发器使用.
我的问题是,只有当鼠标位于网格本身的某个控件(即Button或ComboBox)之外时,"IsMouseOver"属性才会更改.
例如:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="1">A Button</Button>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Opacity" Value="0.5"></Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="1"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
Run Code Online (Sandbox Code Playgroud)
上面的Grid及其内容将以半透明度显示,以便您可以看到控件.
您会注意到,如果将鼠标悬停在第一列(不包含任何内容)上,则不透明度将不会设置为完整.
但是,如果将鼠标悬停在第二列中的按钮上,则不透明度将设置为完整.
在我的应用程序中,我正在设置触发器的网格显示在图像控件的顶部.我不希望在鼠标悬停在图像上之前显示网格...换句话说,由于网格位于图像的顶部,我不希望显示网格,直到鼠标悬停在图像上方网格(网格中的任何位置),因为网格位于图像的顶部.
有谁知道如何做到这一点?
谢谢!
-Frinny
对于我的生活,我无法在TemplateField中绑定CheckBox控件的Checked属性(明确地说).
我试过了:
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="deactivated" runat="server" checked="<%#Eval("Deactivated")%>"></asp:CheckBox>
</ItemTemplate>
<asp:TemplateField>
Run Code Online (Sandbox Code Playgroud)
和
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="deactivated" runat="server" checked="<%#Eval(Container.DataItem, "Deactivated")%>"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
</asp:TemplateField>
Run Code Online (Sandbox Code Playgroud)
我一直看到警告说:
无法从'Checked'属性的字符串表示''创建'System.Boolean'类型的对象
我究竟做错了什么?
我不确定我在这里做错了什么......
我有一个自定义HashTable,它有一个允许某人从HashTable中删除"partNumber"(值)的方法.
删除方法如下:
class COSC202HashTable : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
//....
private List<int> underlyingList;
//...
public List<int> HashList { get { return underlyingList; } }
public void Delete(int partNumber)
{
string theAlgoritnm = Algorithm;
if (String.Compare(theAlgoritnm, "Modulo Division") == 0 && String.Compare(Probe, "Linear Collision Resolution") == 0)
{
LinearModularDivision(partNumber, false);
}
if (String.Compare(theAlgoritnm, "Modulo Division") == 0 && String.Compare(Probe, "Key Offset Collision Resolution") == 0)
{
KeyOffsetModularDivision(partNumber, false);
}
if (String.Compare(theAlgoritnm, "Pseudorandom") == 0)
{
Pseudorandom(partNumber, false);
} …Run Code Online (Sandbox Code Playgroud) 我的页面上有2个用户控件.一个用于搜索,另一个用于编辑(以及其他一些东西).
提供搜索功能的用户控件使用GridView显示搜索结果.这个GridView有一个用于编辑的CommandField(showEditButton ="true").
我想将GridView放入UpdatePanel,以便通过搜索结果进行分页是顺利的.
问题是,当用户单击编辑链接(CommandField)时,我需要执行整页回发,以便可以隐藏搜索用户控件并显示编辑用户控件.
编辑:我需要进行整页回发的原因是因为编辑用户控件在我的GridView所在的UpdatePanel之外.它不仅在UpdatePanel之外,而且在一个完全不同的用户控件中.
我不知道如何将CommandField作为整页回发触发器添加到UpdatePanel.PostBackTrigger(用于指示控件导致整页回发)将ControlID作为参数; 但是CommandButton没有ID ......你可以看出为什么我遇到这个问题.
更新我试图解决问题的其他方法: 我采用了一种新方法来解决问题.
在我的新方法中,我使用了TemplateField而不是CommandField.我在TemplateField中放置了一个LinkButton控件并为其命名.在GridView的RowDataBound事件期间,我检索了LinkButton控件并将其添加到UpdatePanel的触发器中.
这是UpdatePanel和GridView的ASP标记
<asp:UpdatePanel ID="SearchResultsUpdateSection" runat="server">
<ContentTemplate>
<asp:GridView ID="SearchResultsGrid" runat="server"
AllowPaging="true"
AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
<asp:LinkButton ID="Edit" runat="server" Text="Edit"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField ......
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
在我的VB.NET代码中.我实现了一个处理GridView的RowDataBound事件的函数.在这个方法中,我找到了绑定行的LinkButton,为LinkButton创建一个PostBackTrigger,并将其添加到UpdatePanel的触发器.这意味着为GridView 编辑中的每个"编辑"LinkButton创建了一个PostBackTrigger :这并没有为每个"编辑"LinkButton创建一个PostBackTrigger,因为GridView中的所有LinkButton的ID都是相同的.
Private Sub SearchResultsGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles SearchResultsGrod.RowDataBound
If e.Row.RowType = DataControlRowType.Header Then
''I am doing stuff here that does not pertain to the problem
Else
Dim editLink As LinkButton = …Run Code Online (Sandbox Code Playgroud) 我目前正在使用GridView,我想根据行所绑定的对象的属性为Row设置CssClass.
我尝试了以下但它不起作用(见评论):
<asp:GridView id="searchResultsGrid" runat="server" AllowPaging="true" PageSize="20" AutoGenerateColumns="false">
<!-- The following line doesn't work because apparently "Code blocks
aren't allowed in this context: -->
<RowStyle CssClass="<%#IIF(DataBinder.Eval(Container.DataItem,"NeedsAttention","red","") %>
<Columns>
<!--............-->
</Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)
现在我可以简单地处理GridView的RowDataBound事件并更改那里的行的css类......但我试图在UI和页面/业务逻辑层之间保持清晰的分离.
我不知道如何做到这一点,我期待听到任何建议.
谢谢,
-Frinny
我试图将"文本对齐"应用于ContentControl.由于ContentControl没有像TextBlock那样的水平或垂直文本对齐属性,因此我尝试使用ContentControl的HorizontalContentAlignment属性.
我的问题是我无法使用ContentControl本身.
在我的例子中,我有一个显示"hello world"的内容控件和一个显示"change it"的按钮.
当我单击按钮时,我在内容控件和按钮上设置HorizontalContentAlignment.按钮的内容会更改,但内容控件的内容不会更改.
这是我的XAML代码:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ContentControl x:Name="ctrl" Width="525">
Hello World!
</ContentControl>
<Button x:Name="btn" Grid.Row="1" Content="Change It" Click="btn_Click"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
这是按钮点击事件的VB.NET代码:
Class MainWindow
Private Sub btn_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
If (ctrl.HorizontalContentAlignment = HorizontalAlignment.Left) Then
ctrl.HorizontalContentAlignment = HorizontalAlignment.Right
btn.HorizontalContentAlignment = Windows.HorizontalAlignment.Right
Else
ctrl.HorizontalContentAlignment = HorizontalAlignment.Left
btn.HorizontalContentAlignment = Windows.HorizontalAlignment.Left
End If
ctrl.UpdateLayout()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
由于各种原因,我无法用文本块替换我的内容控件,但我仍然需要能够对齐内容.
编辑:
虽然Narohi解决了建议的工作原理,但我仍然对内容控件的HorizontalContentAlignment属性不对齐内容感到困惑.
我尝试了一个Label控件(继承自ContentControl),它的HorizontalContentAlignment属性正确地对齐内容.
(再次编辑:我不再对此感到困惑,似乎在所有情况下都没有正确使用HorizontalContentAlignment.)
这是我更新的XAML代码:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" …Run Code Online (Sandbox Code Playgroud) wpf ×6
asp.net ×3
data-binding ×2
gridview ×2
vb.net ×2
.net ×1
alignment ×1
asp.net-ajax ×1
checkbox ×1
font-size ×1
styles ×1
text-align ×1
wpf-controls ×1
xaml ×1