小编Kel*_*lly的帖子

WPF INotifyPropertyChanged没有更新数组属性?

我创建了一个小例子来演示我遇到的问题.

我的班级第一名:


public class DisplayRow : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int?[] values;
    private string title;

    public string Title
    {
        get { return title; }
        set
        {
            title = value;
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Title"));
        }
    }

    public int?[] Values
    {
        get { return values; }
        set
        {
            values = value;
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Values[]"));
        }
    }

    public DisplayRow()
    {
        Values = new int?[6];
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是Values属性,因为它是一个数组.我不确定当数组中的元素更新时如何正确调用INotifyPropertyChanged.

这是我的xaml:

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

c# wpf inotifypropertychanged

3
推荐指数
1
解决办法
6763
查看次数

Wpf带到前面

我有一个ItemsControl,它使用Canvas和ItemsPanel.itemsTemplate托管自定义控件.当点击控件时我希望它"移到前面".我知道我可以在我的控制中使用ZIndex这样做:

 private void MyControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if(((FrameworkElement)sender).TemplatedParent==null) return;
    ContentPresenter presenter = (ContentPresenter)((FrameworkElement) sender).TemplatedParent;

    int currentValue = Panel.GetZIndex(presenter);
    Console.WriteLine(currentValue);
    Panel.SetZIndex(presenter, 99);
}
Run Code Online (Sandbox Code Playgroud)

这可以正常工作并设置ZIndex.但是当我点击ItemsControl中的不同控件时,它将获得完全相同的ZIndex,因此它不会"移动到另一个控件的前面".

基本上我只想要与windows展示相同的行为.

我已经尝试在PreviewMouseUp事件中将ZIndex设置为0,这确保了单击的控件始终位于顶部,但由于所有其他控件具有相同的ZIndex为0,因此将基于其中的位置采用默认顺序列表.

一个例子:

假设我有3个控件,ZIndex都为0.(所以他们使用默认的列表位置.)

如果我点击控件3,那么2然后1.我希望它在ZOrder的顶部有3,然后是2然后1.但是因为我在MouseUp上将ZIndex设置为零,它将具有默认顺序1,2,3.

有没有一种简单的方法来处理这个问题,或者我是否需要跟踪顺序并递增递减任意值,例如我自己的99?

c# wpf z-index

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

VBS 如何制作自定义选项按钮?

我想创建一个 VB 脚本,它将有 3 个按钮:A 天,B 天作为 C 天,然后让每个按钮启动一个批处理文件。我知道如何制作预设按钮(是、否、中止、重试等),但不知道如何自定义。任何帮助将不胜感激!谢谢。

windows vbscript batch-file

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

使用 CollectionViewSource 和 DataBinding 进行 WPF 分组

我将 a 绑定CollectionViewSource到 aListView以对项目进行分组。一切都很好,除非我更新其ObservableCollection基础CollectionViewSource。如果我更新集合中对象的值,则 UI 永远不会更新。这是一个例子:

<ListView x:Name="MyListView" Margin="0,0,0,65">
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Margin" Value="0,0,0,5"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                <Expander IsExpanded="true" BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1">
                                    <Expander.Header>
                                        <DockPanel>
                                            <TextBlock FontWeight="Bold" Text="{Binding Name}" Margin="5,0,0,0" Width="80"/>
                                            <TextBlock FontWeight="Bold" Width="60" TextAlignment="Center" Margin="16,0,0,0" Text="{Binding Items, Converter={StaticResource Converter2}}" />
                                        </DockPanel>
                                    </Expander.Header>
                                    <ItemsPresenter />
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </ListView.GroupStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="300" Header="Amount" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Amount}" Margin="80,0,0,0"/>
                    </DataTemplate>
                 </GridViewColumn.CellTemplate> …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf collectionviewsource

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

具有多个ViewModel的WPF MVVM ItemsControl,具体取决于对象类型

我有一个集合,它包含多个类型的项目,这些项目都从同一个接口继承.这绑定到ItemsControl.窗口的DataContext设置为包含集合的ViewModel.

我想要做的是让集合中不同类型的每个项目使用不同的ViewModel.

因此,如果我在itemscontrol中的模板设置如下,我希望第一个模板具有ViewModel1的DataContext,第二个模板具有ViewModel2的DataContext.我无法直接在它们上设置DataContext,因为ItemsControl会将DataContext设置为该项.

任何人都知道这个解决方案,或者使用MVVM更好的方法吗?

<DataTemplate DataType="{x:Type Models:ItemType1}">
    <Controls:MyControl Text="{Binding Body}"/>
</DataTemplate>

<DataTemplate DataType="{x:Type Models:ItemType2}">
    <Controls:MyControl2 Text="{Binding Body}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

c# wpf mvvm

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

拖放式 WPF 数据绑定画布

我有一个项目,其中有一组要绑定 Canvas 的项目。画布被子类化以提供拖动和调整元素大小的能力。拖动和调整大小的代码工作正常,但问题是我无法绑定画布。我发现我可以做到:

<ItemsControl x:Name="Items" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <controls:SuperCanvas Background="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style TargetType="ContentPresenter">
                <Setter Property="Canvas.Left" Value="{Binding Path=X, Mode=TwoWay}" />
                <Setter Property="Canvas.Top" Value="{Binding Path=Y, Mode=TwoWay}" />
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
Run Code Online (Sandbox Code Playgroud)

并且画布被正确绑定并且项目出现在画布上。但是后来我的子类画布不再正常工作。(调整大小和拖动不再起作用。)

这是 SuperCanvas 的代码:

sing System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using Meld.Helpers;

namespace Meld.Controls
{
    public class SuperCanvas : Canvas
    {
        private AdornerLayer aLayer;

        private bool isDown;
        private bool isDragging;
        private double originalLeft;
        private double originalTop;
        private bool selected;
        private UIElement …
Run Code Online (Sandbox Code Playgroud)

wpf binding

0
推荐指数
1
解决办法
960
查看次数