在研究项目的过程中,在选择要发出请求的元素时,有必要制作组合,例如 - “您确定吗?”,如果没有,请返回旧值。问题是我做错了什么?框架工作 4.0。提前致谢。
现在我得到了以下信息:
<x:Array x:Key="UnitArray" Type="sys:UInt32"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:UInt32>0x0</sys:UInt32>
<sys:UInt32>0xFFFFFFFF</sys:UInt32>
</x:Array>
<DataTemplate x:Key="ComboboxOfUnit" >
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" >
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding}" Value="0x0">
<Setter Property="Text" Value="value1"/>
</DataTrigger>
<DataTrigger Binding="{Binding}" Value="0xFFFFFFFF">
<Setter Property="Text" Value="value2"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</DataTemplate>
在资源块和
<ComboBox ItemsSource="{StaticResource ResourceKey=UnitArray}"
SelectedItem="{Binding UnitOf}"
ItemTemplate="{StaticResource ComboboxOfUnit}"/>
在模型中的 xaml 代码的主体中,我们有以下内容
uint _prev_UnitOf;
public uint PrevUnitOf
{
get { return _prev_UnitOf; }
set
{
_prev_UnitOf = value;
if (!_prev_UnitOf.Equals(_UnitOf))
{
// HasHasChangedArray[_UnitOf_] = true;
//bfUnitOf = true;
/HasChanged = true;
}
else
{
//HasHasChangedArray[_UnitOf_] = false;
//bfUnitOf = false;
//HasChanged = isChangedArray();
}
OnPropertyChanged(() => PrevUnitOf);
}
}
uint _UnitOf;
public uint UnitOf
{
get { return _UnitOf; }
set
{
if (!_UnitOf.Equals(value))
if (AppContext.Instance.ErrorReportMSG("Вы уверены?", "", Common.Interfaces.MsgType.Question))
{
_UnitOf = value;
if (!_prev_UnitOf.Equals(_UnitOf))
{
//HasHasChangedArray[_UnitOf_] = true;
//bfUnitOf = true;
//HasChanged = true;
}
else
{
//HasHasChangedArray[_UnitOf_] = false;
//bfUnitOf = false;
//HasChanged = isChangedArray();
}
}
else
{
_UnitOf = _prev_UnitOf;
//bfUnitOf = false;
//HasChanged = isChangedArray();
}
OnPropertyChanged(() => UnitOf);
}
}
其中AppContext.Instance.ErrorReportMSG("Вы уверены?", "", Common.Interfaces.MsgType.Question)
消息框和 OnPropertyChanged(() => UnitOf) 的包装器
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// Метод генерации события изменения свойства объекта
/// </summary>
/// <typeparam name="T">Тип объекта</typeparam>
/// <param name="action">Лямбда функция доступа свойству</param>
protected void OnPropertyChanged<T>(Expression<Func<T>> action)
{
var propertyName = GetPropertyName(action);
OnPropertyChanged(propertyName);
}
/// <summary>
/// Метод получения имени параметра
/// </summary>
/// <typeparam name="T">Тип объекта</typeparam>
/// <param name="action">Лямбда функция доступа свойству</param>
/// <returns>Возвращает имя параметра</returns>
private static string GetPropertyName<T>(Expression<Func<T>> action)
{
var expression = (MemberExpression)action.Body;
var propertyName = expression.Member.Name;
return propertyName;
}
起初,这个问题对我来说似乎很简单,但在实践中我遇到了同样的问题:
ComboBox
如果取消绑定属性的更改,它不想“跳回来”SelectedItem
。通过谷歌搜索和实验找到了解决方案,这里是链接 1和链接 2。最后一个是最有用的。在我看来,这种解决方案的唯一缺点是您必须在 ViewModel 中使用它
Dispatcher.BeginInvoke()
,即 连接using System.Windows;
andusing System.Windows.Threading;
,这对于 ViewModel 来说并不常见。例如,我将 List 属性与字符串一起使用,而不是像作者使用连接的资源数组那样,但实际上这并没有改变任何东西。
这样的 XAML
这是这样一个视图模型
工作插图