我创建了一个小例子来演示我遇到的问题.
我的班级第一名:
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) 我有一个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?
我想创建一个 VB 脚本,它将有 3 个按钮:A 天,B 天作为 C 天,然后让每个按钮启动一个批处理文件。我知道如何制作预设按钮(是、否、中止、重试等),但不知道如何自定义。任何帮助将不胜感激!谢谢。
我将 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) 我有一个集合,它包含多个类型的项目,这些项目都从同一个接口继承.这绑定到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) 我有一个项目,其中有一组要绑定 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 ×5
c# ×3
batch-file ×1
binding ×1
data-binding ×1
mvvm ×1
vbscript ×1
windows ×1
z-index ×1