更改所选项目时,UI不会更新

时间:2018-11-15 17:37:55

标签: c# wpf mvvm data-binding xceed

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

这是问题的一个例子:

首先,我在列表框中选择一个项目。一切都正确填充。 enter image description here

现在,我将仅在UI上更改颜色大小: enter image description here

然后从列表中选择另一个项目: enter image description here

在第一张图片中,我选择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控件: enter image description here

从上面可以看到,一旦我将IntUpDown的值更改为8,即使所选项目正在更改,该值仍将保持在该值,该值应该更改为6。

编辑:这是一个显示问题的小示例应用程序: https://www.dropbox.com/s/l3gu3nj915cstoa/TestApp.zip?dl=0

1 个答案:

答案 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)); 
    }
 }