我有几个具有一些属性的对象,这些属性对所有属性都是通用的.例如:
对象A是X类型,它有10个属性
对象B的类型为Y,它有15个属性
对象C的类型为Z,它有7个属性
所有这些对象都具有共同的"名称","签名"和"校验和"属性.我正在尝试创建一个静态帮助器方法,该方法可以接受包含"name","signature"和"checksum"属性的任何类型的对象.这是可能的还是我实际上需要三种不同的方法(一种接受每种类型的对象)?
编辑 - 为了它的价值,我没有提到这些对象是通过Web服务向我公开的.
我有一个组合框,绑定到这样的字典:
Dictionary<int, string> comboboxValues = new Dictionary<int, string>();
comboboxValues.Add(30000, "30 seconds");
comboboxValues.Add(45000, "45 seconds");
comboboxValues.Add(60000, "1 minute");
comboBox1.DataSource = new BindingSource(comboboxValues , null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
Run Code Online (Sandbox Code Playgroud)
我从SelectedItem获取密钥如下:
int selection = ((KeyValuePair<int, string>)comboBox1.SelectedItem).Key;
Run Code Online (Sandbox Code Playgroud)
因此,如果我的用户选择"45秒"选项,我将返回45000并将该值保存到XML文件中.当我的应用程序加载时,我需要读取该值,然后自动设置组合框以匹配.当我只有45000的键时,是否可以这样做?或者我需要将值("45秒")保存到文件而不是密钥?
我正在编写一个使用第三方库来处理某些数据的应用程序.在一个非常简单的例子中,我有一个像这样的任务运行的方法:
private void ProcessListOfItems(List<string> items)
{
while (items.Count > 0)
{
3rdPartyLibObject.Process(items[0]);
items.Remove(0);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的代码当前的编写方式,我会在Process()方法返回后立即从列表中删除每个项目.但是项目的处理可能会失败,我需要知道是否会发生这种情况.不幸的是,Process()方法不返回bool值来指示项目是否成功处理,而是触发ProcessingComplete和ProcessingFailed事件.我有事件处理程序连接到这样的事件:
3rdPartyLibObject.ProcessingComplete += obj_ProcessingSuccess;
3rdPartyLibObject.ProcessingFailed += obj_ProcessingFailed;
private void obj_ProcessingSuccess(object sender, 3rdPartyLibObject.ProcessingEventArgs e)
{
this.Invoke(new ProcessedHandler(OnProcessed), new object[] { true });
}
private void obj_ProcessingFailed(object sender, 3rdPartyLibObject.ProcessingEventArgs e)
{
this.Invoke(new ProcessedHandler(OnProcessed), new object[] { false });
}
private void OnProcessed(bool success)
{
if (success)
{
Debug.WriteLine("Item was processed succesfully!");
}
else
{
Debug.WriteLine("Failed to process item!");
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是在调用3rdPartyLibObject.Process()之后立即使用我的代码块,直到其中一个事件处理程序触发,因此我知道该项是否未能处理(以及是否应将其从列表与否).我猜这可能不是一个不寻常的情况,但我以前从未遇到过这种情况.是否有一个普遍认同的最佳做法来处理这种情况?
我正在开发一个C#WinForms应用程序,用于向/从硬件设备读取/写入数据.我的应用程序有一个多选列表框,其中包含数字1 - 100000,用户最多可以选择10个数字.当他们完成选择每个数字时,用户单击一个按钮,我的事件处理程序代码需要构建一个固定大小(30字节)的字节数组,使用3个字节来表示每个选定的数字,如果少于10个数字则填充数组选择.
例如,假设我的用户选择以下值:
17
99152
3064
52588
65536
Run Code Online (Sandbox Code Playgroud)
我目前正在使用此代码将每个数字转换为字节数组:
byte[] bytes = BitConverter.GetBytes(selectedNumber);
Array.Reverse(bytes) // because BitConverter.IsLittleEndian() = true
Debug.WriteLine(BitConverter.ToString(bytes));
Run Code Online (Sandbox Code Playgroud)
对于上面列出的数字,这会产生以下结果:
00-00-00-11
00-01-83-50
00-00-0B-F8
00-00-CD-6C
00-01-00-00
Run Code Online (Sandbox Code Playgroud)
BitConverter给了我一个4字节的数组,我只有空间使用3个字节来存储最后一个字节数组中的每个数字.我可以删除每个单独字节数组中最重要的字节,然后像这样构建我的最终数组:
00-00-11-01-83-50-00-0B-F8-00-CD-6C-01-00-00-[padding here]
Run Code Online (Sandbox Code Playgroud)
将其写入设备应该有效.但是从设备读取数组(或类似的数组)会给我带来一些问题.当我有一个3字节的数组并尝试使用此代码将其转换为int ...
int i = BitConverter.ToInt32(bytes, 0);
Run Code Online (Sandbox Code Playgroud)
...我得到"目标数组不够长,无法复制集合中的所有项目." 我想我可以在每三个字节的开头插入一个0x00的最高有效字节,然后转换它,但是有更好的方法吗?
我正在开发一个WinForms应用程序,它接受数字字符串作为输入.如果我的用户输入了连续的数字范围,他/她可以使用如下的速记符号表示该范围:
12[3-5]5550[000-100]
Run Code Online (Sandbox Code Playgroud)
使用该示例,我需要将该字符串扩展为它包含的整个数字范围,如下所示:
1235550000
1235550001
1235550002
..........
1235550100
1245550000
1245550001
1245550002
..........
1245550100
1255550000
1255550001
1255550002
..........
1255550100
Run Code Online (Sandbox Code Playgroud)
除0-9外,字符串仅包含[, - 和],它们是用于表示范围的字符.作为将示例字符串扩展为单个数字的过程的一部分,我也想验证字符串.例如,必须有相同数量的[和]字符.在括号内,范围中的第一个数字必须小于范围中的第二个数字.这些类型的东西.
是否存在执行此类字符串操作的现有模式?
我有一个WPF应用程序,其中包含约50个控件,这些控件绑定到我的业务对象上实现INotifyPropertyChanged的属性.这是我的业务对象的快速片段:
public class MyBusinessObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
// properties begin here
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value)
{
return;
}
_name = value;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
// constructor, etc. not shown
}
Run Code Online (Sandbox Code Playgroud)
我还有几个验证规则,用于验证这些控件中的用户输入.如果有任何验证错误,我正在使用命令绑定来阻止我的用户保存数据.我的应用程序还包括一个"重置默认值"按钮,显然,它将重置业务对象上所有属性的默认值.除了一个例外,这一切都完全符合我的要求.如果我的用户将无效数据输入一个或多个控件,然后单击"重置默认值"按钮,则包含无效数据的控件并不总是按照我的预期更新.这是因为我的属性设置器中的以下代码:
if (_name == value)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
存在此代码是为了防止在我的用户在绑定的UI控件中输入的值与属性已设置的值相同时发生不必要的属性更改通知.举个例子,我的UI中有一个IntegerUpDown控件(这个控件是Xceed的Extended WPF Toolkit的一部分).我的控件绑定的属性的默认值是10.我的用户从控件中删除了值,并且触发了我的验证规则,这导致验证错误,并且使用错误装饰器等适当地更新UI.此控件映射到的属性尚未更改,因此它仍设置为10.现在我的用户单击"重置默认值"按钮,这将导致重置属性的默认值(10).但是,属性的值已设置为10,因此我的setter中的短路逻辑将返回而不是设置属性值.
所以现在,在我的用户点击"重置默认值"后,我也强制更新我的绑定目标,如下所示:
this.myIntegerUpDown.GetBindingExpression(Xceed.Wpf.Toolkit.IntegerUpDown.ValueProperty).UpdateTarget();
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题,但仅限于此特定控件.是否有任何简单的方法可以为我的所有 …
我有一个WPF应用程序,其UI包含一个复选框和一个文本框.复选框和文本框绑定到业务对象上的属性.我一直在使用验证规则来验证用户输入,并且在大多数情况下,它们非常简单(检查值不为空/空,检查值是否在某个范围内等).FWIW,这是我现有的XAML:
<StackPanel>
<CheckBox x:Name="requirePinNumberCheckBox" IsChecked="{Binding Path=RequirePinNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">Require PIN number</CheckBox>
<TextBox x:Name="pinNumberTextBox" Style="{StaticResource textBoxInError}" PreviewTextInput="pinNumberTextBox_PreviewTextInput">
<TextBox.Text>
<Binding Path="PinNumber" Mode="TwoWay" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<local:PinNumberValidationRule ValidationStep="RawProposedValue"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
我对文本框的验证规则很简单:
public class PinNumberValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
// make sure that the PIN number isn't blank
if (string.IsNullOrEmpty(value.ToString()))
{
return new ValidationResult(false, "PIN number cannot be blank.");
}
else
{
return new ValidationResult(true, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
与我的大多数其他验证方案不同,文本框的ValidationRule 仅在选中复选框时应用(或者更确切地说,当复选框绑定的布尔属性设置为TRUE时).谁能告诉我如何实现这样的东西?谢谢!
我有一个带有垂直 UIStackView 的 UITableViewCell,它当前具有 .alignment = fill 和 distribution = fill。在堆栈视图中,我有一个 UILabel 和一个 UIImageView。
标签应该左对齐并在堆栈视图的宽度上拉伸(确实如此)。图像视图具有纵横匹配的内容模式,应该在堆栈视图的中间居中。我认为这是按照我想要的方式工作,直到我在 UIImageView 上设置背景颜色,然后意识到虽然图像本身看起来是正确的(缩放和居中),但视图本身延伸到 stackview 的整个宽度(就像标签一样)做)。
是否可以让标签拉伸堆栈视图的宽度而不是图像视图的宽度?理想情况下,我希望图像视图只是缩放图像的大小,而不是一直延伸到堆栈视图的边缘。
我正在更新一些现有的 WPF 代码,我的应用程序有许多这样定义的文本块:
<TextBlock x:Name="textBlockPropertyA"><Run Text="{Binding PropertyA}"/></TextBlock>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,“PropertyA”是我的业务类对象的一个属性,定义如下:
public class MyBusinessObject : INotifyPropertyChanged
{
private void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
private string _propertyA;
public string PropertyA
{
get { return _propertyA; }
set
{
if (_propertyA == value)
{
return;
}
_propertyA = value;
OnPropertyChanged(new PropertyChangedEventArgs("PropertyA"));
}
}
// my business object also contains another object like this
public SomeOtherObject ObjectA = new SomeOtherObject();
public MyBusinessObject()
{
// constructor
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个 …
我有以下代码用于更新数据库中的一行:
public int updateSentFieldForIncomingMessage(IncomingMessage incomingMessage)
{
SQLiteDatabase db;
int numberOfRowsAffected;
try
{
db = super.getWritableDatabase();
}
catch (SQLiteException e)
{
File dbFile = context.getDatabasePath(DATABASE_NAME);
db = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
}
try
{
ContentValues values = new ContentValues();
values.put(KEY_MESSAGE_SENT, true);
numberOfRowsAffected = db.update(TABLE_INCOMING_MESSAGES, values, KEY_ID + " = ?", new String[]{String.valueOf(incomingMessage.getId())});
}
finally
{
db.close();
}
return numberOfRowsAffected;
}
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,但现在我想重构该方法,以便它接受一个IncomingMessage列表,而不是单个IncomingMessage参数。但是当我得到以下陈述时:
db.update(TABLE_INCOMING_MESSAGES, values, KEY_ID + " = ?", new String[]{String.valueOf(incomingMessage.getId())});
Run Code Online (Sandbox Code Playgroud)
我不确定如何修改它,以便可以在WHERE子句中指定多个行(通过KEY_ID)。我想做的是说些类似的话KEY_ID IN ( <multiple row IDs here> )。那可能吗?
c# ×7
.net ×3
wpf ×3
data-binding ×2
android ×1
autolayout ×1
bitconverter ×1
blocking ×1
bytearray ×1
combobox ×1
dictionary ×1
events ×1
expand ×1
ios ×1
java ×1
methods ×1
numeric ×1
selecteditem ×1
sqlite ×1
string ×1
textblock ×1
uiimageview ×1
uistackview ×1
validation ×1
winforms ×1
xaml ×1