小编Fri*_*ale的帖子

如何将CollectionContainer绑定到视图模型中的集合?

我有一个视图模型,其中包含一个公开事物集合的属性.我有一个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)

vb.net data-binding wpf xaml

51
推荐指数
2
解决办法
3万
查看次数

有没有办法在VB.NET中定义隐式转换运算符?

在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)

我们非常感谢您对此的任何见解.

.net vb.net

26
推荐指数
1
解决办法
1万
查看次数

WPF自动调整字体大小,直到它适合父控件

我有一个用户控件谁的根元素是一个Grid.

我还有一个ContentControl,它作为一个占位符,用于加载数据时填充的一些文本.此控件可以在用户控件中移动,因此它的位置可以在任何位置.

如果文本太长而无法放入用户控件的根网格中,我想减小ContentControl的字体大小,直到文本适合.

我的问题是我似乎无法找到我可以处理的事件来完成这个过程.我尝试使用ContentControl.LayoutUpdated事件;但是,这个的sender参数似乎总是没有...这实际上没有用!

我真的很期待有关如何实现这一目标的任何建议.

谢谢

-Frinny

wpf font-size wpf-controls

18
推荐指数
1
解决办法
1万
查看次数

WPF窗口样式未应用

我有一个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 styles

17
推荐指数
1
解决办法
2万
查看次数

WPF Grid IsMouseOver属性

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

wpf

16
推荐指数
2
解决办法
8708
查看次数

在TemplateItem中绑定CheckBox的Checked属性

对于我的生活,我无法在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'类型的对象

我究竟做错了什么?

asp.net data-binding checkbox gridview templatefield

11
推荐指数
1
解决办法
4万
查看次数

属性更改时WPF UI未更新

我不确定我在这里做错了什么......

我有一个自定义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)

wpf user-interface

7
推荐指数
1
解决办法
3146
查看次数

如何配置GridView CommandField以在UpdatePanel中触发整页更新

我的页面上有2个用户控件.一个用于搜索,另一个用于编辑(以及其他一些东西).

提供搜索功能的用户控件使用GridView显示搜索结果.这个GridView有一个用于编辑的CommandField(showEditButton ="true").

我想将GridView放入UpdatePanel,以便通过搜索结果进行分页是顺利的.

问题是,当用户单击编辑链接(CommandField)时,我需要执行整页回发,以便可以隐藏搜索用户控件并显示编辑用户控件.

编辑:我需要进行整页回发的原因是因为编辑用户控件在我的GridView所在的UpdatePanel之外.它不仅在UpdatePanel之外,而且在一个完全不同的用户控件中.

我不知道如何将CommandField作为整页回发触发器添加到UpdatePanel.PostBackTrigger(用于指示控件导致整页回发)将ControlID作为参数; 但是CommandButton没有ID ......你可以看出为什么我遇到这个问题.

更新我试图解决问题的其他方法: 我采用了一种新方法来解决问题.

在我的新方法中,我使用了TemplateField而不是CommandField.我在TemplateField中放置了一个LinkBut​​ton控件并为其命名.在GridView的RowDataBound事件期间,我检索了LinkBut​​ton控件并将其添加到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事件的函数.在这个方法中,我找到了绑定行的LinkBut​​ton,为LinkBut​​ton创建一个PostBackTrigger,并将其添加到UpdatePanel的触发器.这意味着为GridView 编辑中的每个"编辑"LinkBut​​ton创建了一个PostBackTrigger :这并没有为每个"编辑"LinkBut​​ton创建一个PostBackTrigger,因为GridView中的所有LinkBut​​ton的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)

asp.net asp.net-ajax

6
推荐指数
2
解决办法
2万
查看次数

如何根据绑定行的Object的属性设置GridView行的RowStyle

我目前正在使用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

asp.net gridview

5
推荐指数
1
解决办法
9157
查看次数

使用Horizo​​ntalContentAlignment属性将Text与ContentControl对齐

我试图将"文本对齐"应用于ContentControl.由于ContentControl没有像TextBlock那样的水平或垂直文本对齐属性,因此我尝试使用ContentControl的Horizo​​ntalContentAlignment属性.

我的问题是我无法使用ContentControl本身.

在我的例子中,我有一个显示"hello world"的内容控件和一个显示"change it"的按钮.

当我单击按钮时,我在内容控件和按钮上设置Horizo​​ntalContentAlignment.按钮的内容会更改,但内容控件的内容不会更改.

这是我的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解决了建议的工作原理,但我仍然对内容控件的Horizo​​ntalContentAlignment属性不对齐内容感到困惑.

我尝试了一个Label控件(继承自ContentControl),它的Horizo​​ntalContentAlignment属性正确地对齐内容.

(再次编辑:我不再对此感到困惑,似乎在所有情况下都没有正确使用Horizo​​ntalContentAlignment.)

这是我更新的XAML代码:

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" …
Run Code Online (Sandbox Code Playgroud)

wpf text-align alignment text-alignment

5
推荐指数
1
解决办法
6681
查看次数