我有一个RadioButton元素,它的IsChecked属性绑定到MyProperty在ViewModel.由于某些原因而Binding具有模式OneWayToSource,它将值RadioButton.IsChecked推向ViewModel.MyProperty.
RadioButton.IsChecked最初false,现在.我想设置一个初始值ViewModel,可能是偶数true.我不能这样做,因为属性被绑定占用.
有没有办法使用Binding该模式并将默认值设置为UI中的绑定属性?像这样的东西:
<RadioButton IsChecked="{Binding MyProperty, Mode=OneWayToSource, DefaultVaule=???}">
</RadioButton>
Run Code Online (Sandbox Code Playgroud) 我知道你的想法:2017年,请不要再提出这个,但我真的找不到任何有价值的解释.
请查看此XAML代码中的ActiveNotes属性.
我在我的XAML中有这个TwoWay绑定,它完美地运行.如果触发了ScaleNotes的PropertyChanged事件并且绑定设置为TwoWay,则它始终更新.
<c:Keyboard
Grid.Row="2"
Grid.Column="0"
PlayCommand="{Binding PlayCommand}"
StopCommand="{Binding StopCommand}"
ActiveNotes="{Binding ScaleNotes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Run Code Online (Sandbox Code Playgroud)
ViewModel中的ScaleNotes属性如下所示.每当它发生变化时,都会保证触发PropertyChanged事件.我检查并仔细检查了一下.ViewModel中的业务逻辑有效.
private ReadOnlyCollection<eNote> _ScaleNotes;
public ReadOnlyCollection<eNote> ScaleNotes
{
get { return _ScaleNotes; }
set { SetField(ref _ScaleNotes, value); }
}
[DebuggerStepThrough]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
[DebuggerStepThrough]
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
Run Code Online (Sandbox Code Playgroud)
到这里一切都很好.每当更改VM中的ScaleNotes属性时,都会更新目标属性ActiveNotes.
现在的问题是: …
我们正在公司里摆弄WebRTC。我偶然发现了一件奇怪的事情,我不确定是 WebRTC 中的设计还是我们这边的实现错误。
我们目前有一个简单的 WebApp,它显示在线联系人的联系人列表。现在可以简单地呼叫联系人列表中的任何用户。
呼叫者和被呼叫者可以自由选择共享网络摄像头和/或音频。然后由 GetUserMedia() (MediaConstraints) 尊重。
现在奇怪的事情:客户端(Chrome 65)只有在呼叫者以启用视频开始时才协商视频通话。如果来电者没有提供他的网络摄像头,我们不会让被叫方网络摄像头流回(如果他允许的话)。
但是,当呼叫者在启用他的网络摄像头的情况下发起呼叫并且被呼叫者决定不显示他的时,一切都按预期进行。(只有来电者有直播)。
如果双方同意播放视频,我们将获得双向视频流。
如果这是这样的话,有人有一些内部知识吗?是否可以在不显示您自己的网络摄像头的情况下给某人打电话,但稍后会看到被叫方的网络摄像头?
提前致谢,斯文
我有一个 WCF 服务,它使用回调合同来通知客户端,类似于这个
public interface IClientCallback
{
[OperationContract(IsOneWay = true)]
void NotifySomething();
}
Run Code Online (Sandbox Code Playgroud)
和调用它的服务代码与此类似
void NotifySomething()
{
try
{
this.callback.NotifySomething();
}
catch (Exception ex)
{
// Log the exception and eat it
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,通过设计回调通知是可选的,即很高兴拥有,但不是必需的。这就是为什么它被标记为OneWay并且实现会处理异常。
由于一些误解,我们认为这足以让我们拥有一个非阻塞的开火即忘方法。但当然这不是真的,所以在某些情况下它会阻塞一段时间,这会导致问题,因为它是从线程同步块内部调用的。所以我们决定通过如下更改定义使其异步
public interface IClientCallback
{
[OperationContract(IsOneWay = true)]
Task NotifySomething();
}
Run Code Online (Sandbox Code Playgroud)
我对客户端实现没有问题,我的问题是如何从服务中调用它。这是我想要做的
async void NotifySomething()
{
try
{
await this.callback.NotifySomething();
}
catch (AggregateException ex)
{
// Unwrap, log the exception(s) and eat it
}
catch (Exception ex)
{
// Log the …Run Code Online (Sandbox Code Playgroud) 你能给我一种通过单向绑定在 ngFor 循环中获取输入值的方法吗?
<div *ngFor="let d of dataList">
<input #inputValue type="text" [ngValue]="d.value">
<button *ngIf="!d.open" (click)="d.open = true">change</button>
<button *ngIf="d.open" (click)="save(d.id, NEWVALUE); d.open = false;">save</button>
<button *ngIf="d.open" (click)="d.open = false">cancel</button>
</div>`
Run Code Online (Sandbox Code Playgroud)
如何设置 NEWVALUE?双向绑定很容易。但点击取消后,值已经改变,因为我不想要。所以会避免这种方式。
我发现的一种解决方案是使用(ngModelChange)。
<div *ngFor="let d of dataList">
<input #inputValue type="text" [ngValue]="d.value" (ngModelChange)="dataChanged($event)">
<button *ngIf="!d.open" (click)="d.open = true">change</button>
<button *ngIf="d.open" (click)="save(d.id); d.open = false;">save</button>
<button *ngIf="d.open" (click)="d.open = false">cancel</button>
</div>
private newVal;
dataChanged(val) {
this.newVal = val;
}
save(id) {
saveDb(id, this.newVal);
}
Run Code Online (Sandbox Code Playgroud)
正如我猜测的那样,这不是清晰且优化的代码。
据我所知,使用 # 进行模板绑定也不适用于 ngFor。喜欢
<div *ngFor="let …Run Code Online (Sandbox Code Playgroud)