我有一个ListBox
,其ItemSource
绑定到PointStyleModel
中包含的PointStylesViewModel
个对象的集合中。 PointStyleModel
类具有三个属性:Size,Name和Color(Color类型为GeoColor-第三方库对象)。
TextBox
绑定到Name
属性。
xceed工具箱IntegerUpDown
已绑定到Size。
xceed工具箱ColorPicker
已绑定到Color。
当前,每当用户在列表上选择一个新项目时,三个控件都会正确更新。但是,如果用户要在UI中更改IntegerUpDown或ColorPicker的值,然后在列表中选择其他项,则UI不会显示正确的值。我不希望仅由于用户更改UI中的值而更新属性。绑定到TextBox
的{{1}}工作正常。我尝试了各种绑定模式和updatesourcetriggers,但是没有运气。
这是我的模特班:
Name
这是我的视图模型:
public class PointStyleModel
{
public int Size
{
get;
set;
}
public string Name
{
get;
set;
}
public GeoColor Color
{
get;
set;
}
}
以下是我观点的相关部分:
public class PointStylesViewModel : ViewModelBase //using Fody's PropertyChangedInterface in the base class
{
public ObservableCollection<PointStyleModel> PointStyles { get; set; } //the listbox is bound to this
public PointStyleModel SelectedPointStyle { get; set; } //bound to the listboxe's selected item
public string PointStyleName { get { return SelectedPointStyle.Name; } }
public Color PointStyleColor
{
get
{
return Color.FromArgb(SelectedPointStyle.Color.AlphaComponent, SelectedPointStyle.Color.RedComponent, SelectedPointStyle.Color.GreenComponent, SelectedPointStyle.Color.BlueComponent); //Need to convert GeoColor to Color
}
}
public int PointStyleSize { get { return SelectedPointStyle.Size; } }
public PointStylesViewModel()
{
PointStyles = new ObservableCollection<PointStyleModel>();
AddDefaultPointStyles(); //add some default styles
SelectedPointStyle = PointStyles.First(); //select the first item in the list when starting up
}
}
这是问题的一个例子:
在第一张图片中,我选择RedSquare6,它在我的VM中使用PointStyleColor属性填充ColorPicker。它是从SelectedPointStyle的Color属性中获取该值的。效果很好。
在第二张图像中,我从ColorPicker控件中选择了一种新颜色,在这种情况下为粉红色。这不应更改任何属性。我只是在更改控件的颜色。 RedSquare6的Color属性仍应为红色。
在第三张图像中,我选择GreenSquare6。 ColorPicker控件现在应该显示为绿色,但仍保持为粉红色,并且不再点击我VM中的PointStyleColor吸气剂。
与<TabItem DataContext="{Binding Path=PointStylesViewModel, Source={StaticResource ViewModelLocator}}">
<Grid>
<ListBox ItemsSource="{Binding PointStyles}" SelectedItem="{Binding SelectedPointStyle}" DisplayMemberPath="Name"/>
<TextBox Text="{Binding PointStyleName, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
<GroupBox Header="Paint">
<Grid>
<xctk:ColorPicker SelectedColor="{Binding Path=PointStyleColor, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" DisplayColorAndName="False" DisplayColorTooltip="True"/>
<xctk:IntegerUpDown Value="{Binding PointStyleSize, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Maximum="20" Minimum="0" />
</Grid>
</GroupBox>
</Grid>
</TabItem>
IntegerUpDown控件相同。
选择新颜色时,颜色选择器和intupdown没有更新。我注意到更改选择时未击中属性。 Size
是。
编辑:这是我的ViewModelBase:
PointStyleName
这是正在发生的事情的图像。我在这里测试intupdown控件:
从上面可以看到,一旦我将IntUpDown的值更改为8,即使所选项目正在更改,该值仍将保持在该值,该值应该更改为6。
编辑:这是一个显示问题的小示例应用程序: https://www.dropbox.com/s/l3gu3nj915cstoa/TestApp.zip?dl=0
答案 0 :(得分:0)
首先,您需要在ViewModelBase中正确实现INotifyPropertyChanged。
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
第二个需要在PointStylesViewModel上更改的选定项上使用它:
private PointStyleModel _selectedPointStyle;
public PointStyleModel SelectedPointStyle
{
get => _selectedPointStyle;
set
{
_selectedPointStyle = value;
OnPropertyChanged();
OnPropertyChanged(nameof(PointStyleColor));
OnPropertyChanged(nameof(PointStyleSize));
}
}